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

时间:2018-02-09 20:34:33

标签: c++ language-lawyer lifetime

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

  

类型T的对象o的生命周期在以下时间结束:

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

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

  •   

我试图找到嵌套在 o 中的对象重用的对象 o 的存储示例(相反标准说的是什么。)

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

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

  • 工会会员:

    union U { double d; int n; }; U u = {1.0}; new (&u.n) int;
    
  • 在chars数组中创建的对象:

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

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

谢谢。

1 个答案:

答案 0 :(得分:5)

我相信,通过这里的嵌套对象"标准只是指这里的成员子对象。从形式上看,成员子对象占用了它们的容器对象的存储空间,没有像这个代码那样的例外

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可以是签名或未签名。

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