2015-10-14 91 views
2

假設`刪除this`我有一個類foo與函數release調用delete this行爲的功能

struct foo 
{ 
    std::int32_t release() const 
    { 
     delete this; 
     return 0; 
    } 
}; 
  1. 爲什麼我連電話delete this鑑於該功能是const

  2. 是否定義了返回0行爲? delete之後的功能是否「排序」?

引用標準的答案(所以我可以在我的代碼中插入一個奇特的評論)將不勝感激。

+2

早晨Slodge:一次我不能回答你的問題。我認爲這是安全的,因爲我在不久前編寫了代碼,我仍然享受全職工作! 1.刪​​除不是真的修改一個對象,它是拋出一個對象失去存在,2.認爲成員函數不過是一個額外的(雖然隱藏)'this'參數的靜態。只要你在刪除對象後不提及'this',你就會好的。 PS是*我們的*代碼。 – Bathsheba

+1

這是在[C++ FAQ](https://isocpp.org/wiki/faq/freestore-mgmt#delete-this)中的一個條目。 – TartanLlama

+0

它用於COM風格的引用計數。 –

回答

1

爲什麼我連電話刪除此給出該函數是常量

因爲delete不一定修改刪除的指針。

是否定義了返回0行爲?刪除後不能使用「sort-of-die」功能嗎?

爲什麼會這樣?該邏輯不會從程序中刪除。該功能保留在內存中供下一個對象使用。它只是this指針被取消。

有一個SO answer指向The ISO C++ FAQ這對一個條目,摘錄其中:

  • 你必須100%正面肯定的休息你成員函數(刪除該行後)不會觸及此對象的任何部分(包括調用任何其他成員函數或觸摸任何數據成員)。這包括將在堆棧中分配的任何對象在析構函數中運行的代碼,這些對象仍處於活動狀態。
  • 你肯定絕對100%肯定沒有人甚至在刪除這行後觸及這個指針本身。換句話說,您不能檢查它,將它與另一個指針進行比較,將它與nullptr進行比較,將其打印出來,進行轉換,對其執行任何操作。
  • 由於您的代碼遵守這些規則,所以沒關係。

    +1

    「它通過值(void *)獲取指針,任何T *都可以被轉換。」 - 這是不正確的,'delete'操作符處理* typed *指針,否則它不能調用析構函數。你所指的是'operator delete'功能。 – TheOperator

    1
    1. 爲什麼我甚至可以在給定函數爲const的情況下調用delete?

    從標準,5.3.5 $ 2刪除[expr.delete]

    [注:一個指針一個const類型可以是 刪除表達式的操作數;在它被用作 delete-expression的操作數之前,沒有必要丟棄指針表達式的常量 (5.2.11)。末端音符]

  • 被限定在返回0的行爲?
  • 我認爲這是安全的。 delete this;將調用析構函數並釋放由對象保存的內存(包括成員變量和基類子對象)。在那之後,如果你不去解析,或者訪問任何成員變量,它將是安全的。

    +0

    加上1/2到目前爲止。 –