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