2011-02-27 86 views
5

是如果被調用函數刪除調用者(成員)函數定義的對象時定義的C++應用程序中的行爲?請求調用者函數體的其餘部分是否仍然執行?如果它不訪問任何成員變量,它會正確運行嗎?C++如果被調用者刪除調用者會發生什麼?

我只是問,因爲我發現這種情況下,我的應用程序(一些玩弄成員函數指針的結果),我很驚訝,爲什麼它不會使我的應用程序崩潰。

+1

隨着軀幹的幫助下,你可以爬上一個樹枝。如果你嘗試@Mahesh你浮在半空中,直到你準備好就跳了下去(安全)切斷樹幹爬到分支:( – Mahesh 2011-02-27 02:42:01

+2

後,你就可以不採取任何新葉與你發生什麼事;) – 2011-02-27 02:44:14

+0

@安德魯 - 那是未定義的行爲。我們不確定,我們能否安全着陸? – Mahesh 2011-02-27 02:45:48

回答

5

是的,那是預期的行爲。只要代碼不訪問任何非靜態成員對象或函數,就沒有理由不能繼續運行。

+1

那就是問題所在。如果一個成員函數不知道它(對象)已被刪除,那麼它如何知道不要觸及它自己的任何非靜態成員。這使得代碼變得非常脆弱,並且從長遠來看可能無法維護(任何維護都會稍微改變行爲,從而導致各種各樣的問題)。 – 2011-02-27 02:50:24

+0

@Martin:我不是說這是一個好習慣。只是這不是未定義的行爲。 – Ferruccio 2011-02-27 02:53:14

+0

@Martin:經典的例子大概是自我引用的對象。不是我說*這是很好的做法,但對於物體的存在並不特別脆弱。您的'deref'或'close'非靜態成員函數想要(有條件地)在返回之前刪除該對象作爲最後一件事,它知道它以後永遠不會明確使用'this'或訪問數據成員。任何調用'deref'的東西都會有同樣的表現。 20分鐘後,你當然會放棄整個計劃並使用'shared_ptr',但因爲代碼*不*工作,而不是因爲它是不可維護;-) – 2011-02-27 03:13:03

-3

的代碼仍然是即使析構函數被調用堆棧上。儘管如此,你不能依賴任何free'd內存不會被覆蓋的事實。但是,如果它沒有被覆蓋,並且析構函數不會覆蓋任何重要的東西,那麼事情會順利進行。

+0

-1,代碼不在堆棧上。 – 2011-02-27 02:53:05

+0

是的,指向調用代碼的指針位於堆棧上。 – 2011-02-27 04:27:45

1

「是的,其餘的調用者將運行」的一個值得注意的例外是Win32的FreeLibraryAndExitThread,它真的刪除了調用者,堆棧空間,代碼和全部。

相關問題