編寫類的拷貝構造函數會在析構函數中刪除對象時發生意外崩潰。請參見下面的代碼:編寫類的拷貝構造函數會在析構函數中刪除對象時發生意外崩潰
class ordinaryClass // Sample class is used in Foo class
{
public:
ordinaryClass(){}
};
class Foo
{
public:
Foo():_ordinarayClass(0)
{
_ordinarayClass = new ordinaryClass();
}
~Foo()
{
delete _ordinarayClass; // the program crashes here when copy constructor is called.
}
Foo(const Foo &obj) // copy constructor
{
*_ordinarayClass = *obj._ordinarayClass;
}
Foo& operator=(const Foo& other) // copy assignment
{
*_ordinarayClass = *other._ordinarayClass;
return *this;
}
ordinaryClass *_ordinarayClass;
};
在主,如果我寫這些代碼:
Foo container2;
Foo container;
container = container2;
程序正常運行和正常退出。 但如果我把它寫在下面的方法:
Foo container2;
Foo container = container2;
程序崩潰而exites。我發現該程序在Foo類的析構函數中崩潰。 我在複製構造函數中犯了什麼錯誤? 非常感謝。
'* _ordinarayClass = * obj._ordinarayClass;'調用未定義的行爲。問你自己什麼目標對象的'_ordinaryClass'指向你做這個任務。 – WhozCraig
@WhozCraig:那麼我該如何寫這個類的複製構造函數和賦值?下面發佈了 – Mosi
。正如我在答覆中所說的,首先考慮一下這個結構是否必須是動態的,因爲從我所看到的情況來看,它不應該是這樣,但是您比代碼更接近代碼。 – WhozCraig