2010-11-29 59 views
13

可能重複:
Is it OK to use 「delete this」 to delete the current object?如果您在C++中刪除,這將發生什麼

我只看到一些代碼,他們已經在一類函數中完成delete this;,我知道,這是不是一個好的設計,而是定義了會發生什麼,讓我們說這個類總是來自某個地方的指針。它是否會以正確的方式被刪除?

class A 
{ 
public: 
    void abort() { delete this; } 
}; 

class B 
{ 
    void func() { A* a = new A; a->abort(); } 
}; 
+2

請參閱http://stackoverflow.com/questions/447379/what-is-the-use-of-delete-this/447531#447531 – icecrime 2010-11-29 16:27:40

+1

鏈接的帖子是相關的,但似乎沒有重複。 – 2010-11-29 17:17:26

回答

17

對於delete this,它在C++中完全合法,對於某些特定的模式(如智能指針)非常有用。儘管如此,開發人員的負擔仍然是確保沒有其他方法被調用,或者在堆棧上的this將在刪除發生後訪問實例數據。

的C++ FAQ精簡版有此閱讀

+3

C++中有很多東西是完全合法的,但仍然是一個糟糕的主意。 – 2010-11-29 17:48:53

0

正如有人所指出的一個評論者有沒有未定義的行爲,如果沒有其他成員被稱爲後刪除 您可以繼續功能,如果你不訪問對象的其他成員。

+2

只要在`delete`語句之後沒有使用成員變量,就可以很好地定義行爲。 – MartinStettner 2010-11-29 16:29:19

1

是一個條目,這是值得。您只需要注意,在delete語句後面使用了沒有實例變量(我認爲沒有虛擬方法),因爲this指針在delete之後將不再有效。

+0

這不是你必須關心的唯一事情。 – 2010-11-29 17:16:29

1

是的,應該正常刪除。

有些情況下這很有用,但需要格外小心以確保該對象在此之後從未被訪問。

0

在它是確定這種特殊情況下,但認爲如果a是自動變量會發生什麼:

void foo() { 
    A a; 
    a.abort(); // BOOM! 
} 
2

這是不是這樣說delete this;是糟糕的設計,它肯定不會導致不確定的行爲。它做你期望的 - 它刪除這個對象。這意味着你最好確保在調用delete this之後不要對該對象進行任何其他操作。

Microsoft MFC類使用delete this;廣泛,例如在CWnd(窗口)類中。當一個窗口收到WM_DESTROY消息時,不再需要窗口包裝類(這是C++對象的類),所以它調用delete this;(我認爲在PostNcDestroy(),類似的地方)。從框架用戶的角度來看,它非常整潔:您只需要記住C++對象自動刪除的方法,並且在窗口的生命週期結束時要小心一點。

我相信還有很多其他的現實世界的例子,其中delete this;是一個有用的範例。

相關問題