簡體   English   中英

關於C ++中用於自定義對象的構造函數/析構函數和new / delete運算符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM