舉個例子:
class CCopyConstructor { public: CCopyConstructor() { m_test = new int[5]; } ~CCopyConstructor() { delete[] m_test; } private: int *m_test; };這個class看起來很正常,在建構式裡有new,然後在解構式裡有delete,very good!但是我們在使用此class的時候:
CCopyConstructor a; CCopyConstructor b(a); CCopyConstructor c; c = a;這看起來還是很ok啊!但是執行起來卻會發生程式當掉的結果,為什麼呢?首先先來看CCopyConstructor b = a,a建立起來了,然後m_test的空間也建立出來了,這時再建立b(a),也就是複製a的內容貼到b上,所以m_test指標也是一併複製過去,那麼b裡面的m_test所指的位址會跟a的一樣,然後程式結束時要跑解構式,第一個先delete掉m_test所指的位址,這時換第二個要delete就delete不到了,所以程式就爆炸了!
另一個問題是memory leak,因為c也會run建構式,會分配記憶體給m_test,但是又用a去覆蓋掉c,所以會有leak的問題。
要怎麼避免這些問題呢?
1. 請乖乖地實作copy constructor及copy assignment operator。
public: CCopyConstructor(const CCopyConstructor &inCCopyConstructor); CCopyConstructor& operator = (const CCopyConstructor &inCCopyConstructor);2. 不然就把copy constructor及copy assignment operator隱藏起來不給用!
private: CCopyConstructor(const CCopyConstructor &inCCopyConstructor); CCopyConstructor& operator = (const CCopyConstructor &inCCopyConstructor);以前都沒想過這問題...囧,要好好記起來!
0 意見:
張貼留言