effective C++ 條款 16:成對使用new和delete時要采用相同形式


當你使用new,有兩件事情發生。

第一,內存被分配出來(通過名為operator new的函數)。

第二,針對此內存會有一個(或多個)構造函數被調用。當你使用delete,也有兩件事情發生:針對此內存會有一個或多個析構函數被調用,然后內存被釋放。

數組所用的內存通常還包括”數組大小”的記錄,以便delete知道調用多少次析構函數。

當你調用new時使用[],你必須在對應調用delete時也使用[]。如果你在調用new時沒使用[],那么也不該在對應調用delete時使用[]。

當你撰寫的class含有一個指針指向的動態內存分配,並提供多個構造函數時,你必須小心的在所有構造函數中使用相同形式的

new將指針成員初始化。否則,不知道該在析構函數中使用什么形式的delete。因為析構函數只有一個。

這個規則對於稀罕使用typedef的人也很重要:

typedef std::string AddressLines[4];

由於AddressLines是個數組,如果這樣使用new:

std::string* pal = new AddressLines; //注意,“new AddressLines”返回一個string*,就像“new string[4]”一樣

那必須匹配數組形式的delete:

delete pal; //行為未定義

delete [] pal; //很好。

為避免此類錯誤,最好不要對數組形式做typedef動作,真很容易達成,因為C++標准庫含有string,vector等templates,可將數組的需求降至幾乎為0。可將本例的AddressLines定義為vector<string>。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: