2011-01-25 115 views
6

我有一個類,我重載新的和刪除(這些從內存池中獲取並返回內存)。令我感到沮喪的是,我重載的類仍然具有在調用刪除重載函數get之前調用的析構函數。我怎樣才能阻止呢?停止析構函數被調用

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

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

編輯:

我在想,這個類的成員將被破壞,但記憶不會被析構函數釋放正確的;刪除函數擁有這種責任,在這種情況下,我可以阻止內存被釋放?

結果: Penny認爲分配/釋放內存和構建/銷燬是單獨的項目。我現在有空的析構函數並重載新的/刪除。

+2

我不知道爲什麼這是令人沮喪的; C++在這方面非常合乎邏輯。如果你不需要做任何事情,留下一個空的析構函數。 – 2011-01-25 19:08:19

回答

6

銷燬和解除分配是兩個正交的東西,一個不應該抑制另一個。你會如何處理堆棧中創建的類的實例?不清理他們的資源?您正試圖打破RAII的一個非常有用的概念。

4

我不認爲你可以防止被調用的析構函數,我不知道你爲什麼想要。在釋放內存之前必須銷燬對象 - 如果超類分配了一些資源,則析構函數必須在釋放對象的內存之前釋放它們。

編輯完成後編輯:是的,析構函數會清理它們分配的任何東西,但不會釋放對象的內存。您正在編寫的delete方法可以做到這一點。

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

3

如果您擔心(一)從特定池抓住內存和(b)控制時析構函數被稱爲一個選擇是placement new

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

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

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

0

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

回答一個你沒有問過的問題,無論是使用帶有內存池的對象的一個​​好的解決方案,答案通常是 - 「不」。你想要的是你的類,使用內存池來分配類。它允許更多的靈活性,並且通常你不只有一個類,但是很多會放在內存池中,所以你不希望大量超載所有新的/刪除函數。此外,擁有多個分配方案(因此也包含分配器)並不少見,但您只能重載新/刪除一次。

+0

回答你的問題:如何防止在C++中調用析構函數?這隻有在你要使用新的分配位置時才能完成,在這種情況下,你(作爲程序員)必須負責手動調用析構函數(如Doug所說:p->〜Foo :: Foo() ;)。當程序員手動調用析構函數時,這是語言中唯一的實例。 – Viren 2011-01-25 20:43:39