簡體   English   中英

C ++標准:生命周期結束

[英]C++ Standard: end of lifetime

在C ++標准的basic.life部分,可以找到以下內容(強調我的):

類型T的對象o的生命周期結束時:

  • 如果T是具有非平凡析構函數([class.dtor])的類類型,則析構函數調用將啟動,或者

  • 對象占用的存儲被釋放,或被未嵌套在o中對象重用([intro.object])。

我試圖找到對象的存儲示例o嵌套在o中的對象重用(與標准所說的相反)。

首先,我需要確保我理解標准的含義是“對象占用的存儲被嵌套在o中的對象重用”。 首先,為了重用存儲,必須創建一個新對象。 其次,為了重用o的存儲,必須在o使用的內存位置創建新對象。 最后,必須在一個內存位置創建新對象,該位置將使新對象“嵌套在o中”,例如在已經存在的對象“nesten in o”的位置。 它是否正確?

我想到了一些例子,例如:

  • 工會會員:

     union U { double d; int n; }; U u = {1.0}; new (&u.n) int; 
  • 在chars數組中創建的對象:

     char mem[sizeof(int)]; new (mem) int; 

這些是正確的嗎? 還有其他例子嗎?

謝謝。

我相信,通過“嵌套對象在這里”標准只是指這里的成員子對象。 從形式上看,成員子對象占用其容器對象的存儲空間,沒有像此代碼那樣的異常

struct X {
    Y y;
};

void foo(X& x) {
    new (x.y) Y;
}

將結束x的存儲。

每個標准( http://eel.is/c++draft/intro.object#4 )的嵌套對象的另一個示例是一個對象為另一個對象提供存儲的情況。 unsigned char (或std::byte )數組可以為另一個對象提供存儲,如果它是在其中創建的,則為placement new。 這幾乎是您的第二個示例,但在您的情況下,char可以是簽名或未簽名的。

您的聯合示例是占用相同存儲的非嵌套對象的正確示例。

暫無
暫無

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

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