Trong chương trình sau đây, tôi dự định sao chép char* linenộ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 obj2hoạt động tốt nhưng lại objgặp sự cố. gdb hiển thị các địa chỉ khác nhau của linecả 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 strlentrên một con trỏ null.