C++标准:生命周期结束

use*_*768 4 c++ lifetime language-lawyer

在C++标准的basic.life部分,可以找到以下内容(强调我的):

类型T的对象o的生命周期结束时:

  • 如果T是具有非平凡析构函数([class.dtor])的类类型,则析构函数调用将启动,或者

  • 对象占用的存储被释放,或被未嵌套在o中对象重用([intro.object]).

我试图找到对象的存储示例o嵌套在o中的对象重用(与标准所说的相反).

首先,我需要确保我理解标准的含义是"对象占用的存储被嵌套在o中的对象重用".首先,为了重用存储,必须创建一个新对象.其次,为了重用o的存储,必须在o使用的内存位置创建新对象.最后,必须在一个内存位置创建新对象,该位置将使新对象"嵌套在o中",例如在已经存在的对象"nesten in o"的位置.它是否正确?

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

这些是正确的吗?还有其他例子吗?

谢谢.

Ser*_*eyA 5

我相信,通过"嵌套对象在这里"标准只是指这里的成员子对象.从形式上看,成员子对象占用其容器对象的存储空间,没有像此代码那样的异常

struct X {
    Y y;
};

void foo(X& x) {
    new (x.y) Y;
}
Run Code Online (Sandbox Code Playgroud)

会结束存储x.

每个标准(http://eel.is/c++draft/intro.object#4)的嵌套对象的另一个示例是一个对象为另一个对象提供存储的情况.一个unsigned char(或std::byte)数组可以为另一个对象提供存储,如果它是在其中创建的,则使用placement new.这几乎是您的第二个示例,但在您的情况下,char可以是签名或未签名的.

您的联合示例是占用相同存储的非嵌套对象的正确示例.