Tôi vừa nhận ra một điều đáng lo ngại. Mỗi lần tôi viết một phương thức chấp nhận std::string
như một tham số, tôi đã tự mở ra hành vi không xác định.
Ví dụ, điều này ...
void myMethod(const std::string& s) {
/* Do something with s. */
}
... có thể được gọi như thế này ...
char* s = 0;
myMethod(s);
... Và tôi không thể làm gì để ngăn chặn điều đó (mà tôi biết).
Vì vậy, câu hỏi của tôi là: Làm thế nào một người bảo vệ chính họ khỏi điều này?
Cách tiếp cận duy nhất nảy ra trong đầu là luôn viết hai phiên bản của bất kỳ phương thức nào chấp nhận std::string
một tham số, như thế này:
void myMethod(const std::string& s) {
/* Do something. */
}
void myMethod(char* s) {
if (s == 0) {
throw std::exception("Null passed.");
} else {
myMethod(string(s));
}
}
Đây có phải là một giải pháp phổ biến và / hoặc chấp nhận được?
EDIT: Một số người đã chỉ ra rằng tôi nên chấp nhận const std::string& s
thay vì std::string s
như một tham số. Tôi đồng ý. Tôi đã sửa đổi bài viết. Tôi không nghĩ rằng thay đổi câu trả lời mặc dù.
char* s = 0
là không xác định. Tôi đã nhìn thấy nó ít nhất vài trăm lần trong đời (thường ở dạng char* s = NULL
). Bạn có một tài liệu tham khảo để sao lưu đó?
std:string::string(char*)
xây dựng
const std::string&
tham số đó không ...?)
c_str
tính của đối tượng chuỗi không?