次のプログラムでは、char* line
を介してオブジェクト間でコンテンツをコピーするつもりstrcpy
です。ただし、プログラムが終了すると、デストラクタはobj2
正常に動作しますが、obj
クラッシュは発生しません。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;
MyClass obj1; MyClass obj2 = obj1;
あなたが呼び出しますので、まだセグメンテーションフォールトうstrlen(obj1.line)
としますstrlen(NULL)
。のようにMyClass obj1; obj1.len();
。
MyClass obj1; obj1.len();
を呼び出すのは未定義の動作strlen
です。