簡體   English   中英

停止調用析構函數

[英]Stopping destructor being called

我有一個類,我正在重載new和刪除(這些從內存池獲取和返回內存)。 令我感到沮喪的是,我重載的類仍然在調用delete重載函數之前調用了析構函數。 我怎么能阻止這個?

class Message
{
    ~Message() { ... }

    void* operator new(std::size_t sz) { ... }
    void operator delete(void* ptr) { ... }
};

編輯:

我認為類的成員會被破壞但是破壞者不會釋放記憶,這是正確的; delete函數擁有這個責任,在這種情況下,我可以阻止內存被釋放?

結果: Penny拒絕了內存和構造/銷毀的分配/釋放是單獨的項目。 我現在有空的析構函數和重載的新/刪除。

破壞和解除分配是兩個正交的事情,一個不應該抑制另一個。 對於在堆棧上創建的類的實例,您會怎么做? 沒有清理他們的資源? 您正試圖打破一個非常有用的RAII概念。

我認為你不能阻止析構函數被調用,我不確定你為什么要這樣做。 在釋放內存之前必須銷毀對象 - 如果超類分配了一些資源,它的析構函數必須在對象的內存空閑之前釋放它們。

編輯后編輯:是的,析構函數會清除它們分配的任何內容,但不會釋放對象的內存。 您正在編寫的delete方法就是這樣做的。

順便說一句,好名字。 :-)

如果您擔心(a)從特定池中獲取內存並且(b)控制何時調用析構函數,則一個選項是新位置

void* raw = allocate(sizeof(Foo));  // line 1
Foo* p = new(raw) Foo();            // line 2

p->~Foo();   // explicitely call destructor

(代碼取自上面鏈接到C ++ FAQ)

回答你的問題,無論是否重載new / delete,都會調用構造函數和析構函數。

回答一個你沒有問的問題,對於使用內存池的對象是否是一個很好的解決方案,答案通常是“不”。 你想要的是你的類,使用內存池來獲取一個allocator類。 它允許更多的靈活性,通常你不僅有一個類,而是許多將被放入內存池,因此你不希望所有新/刪除函數的質量超載。 此外,擁有多個分配方案(以及分配器)並不罕見,但您只能重載新/刪除一次。

7年后,它可能很容易顯得聰明,但是讓我寫下這個。

標准C ++(17/20)是非常有價值的語義驅動語言 ,或者正如Creator所說:“新語言”。

所以,如果你真的需要,請選擇值(和必要時的引用)並使用“智能”指針。 最重要的是忘記重載新的和/或刪除。 你知道該怎么做 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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