Trong chương trình sau đây, tôi dự định sao chép char* line
nội dung từ đối tượng này sang đối tượng khác thông qua strcpy
. Tuy nhiên, khi chương trình kết thúc, công cụ phá hủy obj2
hoạt động tốt nhưng lại obj
gặp sự cố. gdb hiển thị các địa chỉ khác nhau của line
cả hai đối tượng.
class MyClass {
public:
char *line;
MyClass() {
line = 0;
}
MyClass(const char *s) {
line = new char[strlen(s)+1];
strcpy(line, s);
}
~MyClass() {
delete[] line;
line = 0;
}
MyClass &operator=(const MyClass &other) {
delete[] line;
line = new char[other.len()+1];
strcpy(line, other.line);
return *this;
}
int len(void) const {return strlen(line);}
};
int main() {
MyClass obj("obj");
MyClass obj2 = obj;
MyClass obj1; MyClass obj2 = obj1;
vẫn sẽ segfault vì bạn sẽ gọi strlen(obj1.line)
đó là strlen(NULL)
. Như sẽ MyClass obj1; obj1.len();
.
MyClass obj1; obj1.len();
Đó là hành vi không xác định để gọi strlen
trên một con trỏ null.