![](/img/trans.png)
[英]Objective C “autorelease” in C++ — standard way to control object lifetime?
[英]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.