簡體   English   中英

關於析構函數中 object 壽命的說明

[英]Clarification about object lifetime in destructor

另一個問題引用了 C++ 標准:

3.8/1 “類型 T 的 object 的生命周期在以下情況下結束: — 如果 T 是具有非平凡析構函數 (12.4) 的 class 類型,則析構函數調用開始,或者 — ZA8CFDE6331BD59EB6669 占用的存儲空間被重用或釋放。 "

這似乎意味着不允許從析構函數訪問 object 的成員。 然而,這似乎是錯誤的,事實更像是 Kerrek SB 的回答中所解釋的:

成員對象在構造函數主體運行之前活躍,並且在析構函數完成之前它們保持活躍。 因此,可以在構造函數和析構函數中引用成員對象。

object 本身直到它自己的構造函數完成后才會激活,並且一旦它的析構函數開始執行它就會死掉。 但這只是外界所關心的。 構造函數和析構函數仍然可以引用成員對象。

我想知道在析構函數中是否可以將對象的地址傳遞給外部 class,例如:

struct Person;
struct Organizer
{
     static void removeFromGuestList(const Person& person); // This then accesses Person members
}

struct Person
{
     ~Person() {
      // I'm about to die, I won't make it to the party
      Organizer::removeFromGuestList(*this);
}

};

這對我來說似乎沒問題,因為我認為對象的生命周期一直持續到析構函數完成之后,但是上述答案的這一部分讓我懷疑:

object 本身直到它自己的構造函數完成后才會激活,並且一旦它的析構函數開始執行它就會死掉。 但這只是外界所關心的。 構造函數和析構函數仍然可以引用成員對象。

C++ 標准在析構函數執行期間,關於 class 成員的確切狀態似乎有點自相矛盾。

但是,此草案 C++ 標准的以下摘錄可能會讓人放心,您對removeFromGuestList function 的調用應該是安全的(我添加了粗斜體格式):

15.7 建造和銷毀

1對於具有非平凡構造函數的 object,在構造函數開始執行之前引用 object 的任何非靜態成員或基 class 會導致未定義的行為。 對於具有非平凡析構函數的 object ,在析構函數完成執行后引用 object 的任何非靜態成員或基 class 會導致未定義的行為。

尚不清楚(至少對我而言)是,一旦析構函數開始執行,通過引用 object 來引用這些 class 成員是否有效。 也就是說,假設您的Person class 有一個成員ObjectType a ,它指的是您removeFromGuestList person.a中的 person.a 是否有效?

另一方面,與其將*this作為其參數傳遞,不如將每個必需的成員作為“不同的對象”傳遞,那么您是安全的; 因此,將 function 重新定義為removeFromGuestList(const ObjectType& a) (帶有可能的附加參數)將是完全安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM