C++ Constructor

當寫了一個class後,有個重點要注意,就是copy constructor及copy assignment operator。


舉個例子:
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 意見:

張貼留言