【发布时间】:2023-03-15 01:50:01
【问题描述】:
在下面的程序中,我打算通过strcpy 将char* line 的内容从一个对象复制到另一个对象。
然而,当程序结束时,obj2 的析构函数工作正常,但obj 的 dtor 崩溃。 gdb 显示两个对象的 line 的不同地址。
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;
【问题讨论】:
-
即使您使用 C 风格的以空字符结尾的字符串,您仍在使用 C++ 进行编程。
-
你也需要一个拷贝构造函数。 Rule of three
-
那是因为我被要求通过strcpy在c++中模拟复制字符串
-
顺便说一句,一旦添加了复制构造函数:
MyClass obj1; MyClass obj2 = obj1;仍然会出现段错误,因为您将调用strlen(obj1.line),即strlen(NULL)。和MyClass obj1; obj1.len();一样。 -
还有未定义的行为:
MyClass obj1; obj1.len();在空指针上调用strlen是未定义的行为。