[英]new[] / delete[] and throwing constructors / destructors in C++
[英]About constructors/destructors and new/delete operators in C++ for custom objects
假設我有自己創建的鏈接列表。 它有自己的析構函數,可以釋放內存。 此鏈接列表不會超載新的或刪除。
現在,我正在嘗試創建一個所述鏈表的數組(如果我理解正確,則打開哈希)。 然后我在這個open anhing類的構造函數中分配必要的內存。 在構造函數中調用的新運算符足以正確地為數組分配內存,對吧? 我不確定,因為我沒有為Linked List類重載新內容。
另外,假設我的鏈接列表數組被稱為元素,我可以在析構函數中寫“delete [] elements”嗎? 是否會為數組中的每個元素調用析構函數並正確釋放內存?
最后,如果我的兩個假設都是正確的(即,我不需要重載new和delete以將它們與我的自定義類一起使用),那么重載這些運算符的重點是什么?
嗯你是對的。 平原
elements = new LinkedList[N];
足以分配它們。 然后,您可以訪問它們
elements[i]->push(....);
並使用您顯示的方式在析構函數中刪除它們:
delete[] elements;
編譯器將記住分配了多少元素,並正確地為每個列表調用析構函數。 重載new和delete運算符的重點是提供自定義內存分配策略。 例如,您可以預先分配內存,然后從該池中獲取,而不是每次從OS分配內存。
但請注意,您還必須編寫復制構造函數和復制賦值運算符。 因為如果有人復制您的哈希映射,則必須復制鏈表,而不僅僅是指針。 或者,您可以將復制構造函數和復制賦值運算符設為私有,並且不要定義它們,禁止哈希映射的副本:
....
private:
MyHashMap(MyHashMap const& rhs);
MyHashMap & operator=(MyHashMap const& rhs);
....
new運算符執行兩項操作:分配內存並調用構造函數。
delete運算符調用析構函數然后釋放內存。
使用new []創建的數組必須使用delete []銷毀。
除性能原因外,您通常不需要重載新的或刪除 。 您可能具有可預測的分配/解除分配模式,這使得特定分配策略非常適合(快速或低內存使用)。
您可以查看此頁面 。
你所有的假設都是正確的。
重載new和delete有很多用途,但不經常這樣做。 一個常見原因是跟蹤內存分配以發現內存泄漏。 很多編譯時間的泄漏跟蹤器都會這樣做,但是有了像valgrind這樣的更好的外部應用程序已經過時了。 你也可以做一些事情,比如使用池化內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.