2010-12-15 80 views
8

可能重複:
Is it OK to use "delete this" to delete the current object?
Should objects delete themselves in C++?有用的成員函數 '刪除'

我只是碰到this問題一提出programmers.stackexchange,看到的問題關於做一個delete this;裏面的成員函數。

從我所瞭解的情況來看,這通常是一個禁忌,然而在某些情況下這可能會有用。什麼時候這樣做會有用,以及沒有這樣做的技術原因是什麼?

+0

另請參閱http://stackoverflow.com/q/1866193/57428和http://stackoverflow.com/q/1866461/57428 – sharptooth 2010-12-15 12:11:01

回答

5

一般來說,這是一個壞主意,因爲當你在技術上處於成員函數內部時,並且突然該類的每個成員現在都失效了。很顯然,如果你在撥打delete this;後沒有碰到任何東西,你會沒事的。但是很容易忘記這些事情,嘗試訪問一個成員變量並獲取未定義的行爲並花費時間在調試器上。

這就是說,它的東西,如微軟的組件對象模型(COM)使用,釋放組件時(注意,這不是他們做什麼作爲CashCow指出,是僅供參考):

void AddRef() { m_nRefs++; } 
void Release() 
{ 
    m_nRefs--; 
    if(m_nRefs == 0) 
     delete this; 
    // class member-variables now deallocated, accessing them is undefined behaviour! 
} // eo Release 

也就是說,在C++中我們有智能指針(例如boost::shared_ptr)來管理對象的生存期。鑑於COM是進程間的,可以通過VB等語言訪問,智能指針不是設計團隊的選擇。

+0

我相信它實際上使用InterlockedDecrement,即原子減量,否則它不會是線程安全的。另外,AddRef和Release是m_nRefs可變的const函數,或者不能複製對象並正確增加引用計數。 – CashCow 2010-12-15 12:31:20

+0

@CashCow,你是對的,但我只是將它作爲一個例子來展示,而不是展示COM使用的*精確*代碼,但是我修改了我的答案以表明它是假設的。 – 2010-12-15 12:33:02

0

我在我的消息處理中使用它。它是pre shared_ptr,它允許消息決定是否自己刪除(異步)或解除阻止發送者(同步)。

5

delete this;通常用於引用計數模式。當其引用計數降至零時,該對象將自行刪除。如果沒有進一步提及被刪除的對象,那完全沒問題。它還要求所述對象駐留在堆/免費商店中。

+2

堆。你的意思是對象必須駐留在堆上。或者是在C++規範中已知的:免費商店。 – 2010-12-15 12:04:36

+0

@ Lenny222不,它必須分配新的刪除刪除。 – CashCow 2010-12-15 12:31:58

+0

@Elemental - 修正 – doron 2010-12-15 12:57:22