c++ Constructor

  • 5922
  • 0
  • C++
  • 2010-05-07

也許大家都知道

當寫了一個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);

以前都沒想過這問題...囧,要好好記起來!