关于对象生存期的问题:N3242草案

Question on object lifetime : N3242 Draft

本文关键字:问题 N3242 草案 生存期 于对象 对象      更新时间:2023-10-16

c++ 11 n3242 "Duration of subbobjects, object lifetime", 3.8/1:

对象的生存期是对象的运行时属性。表示对象如果它是类或聚合类型,则具有非平凡初始化或者它的一个成员是由非平凡构造函数初始化的默认构造函数[注:由一个简单的复制/移动构造函数初始化是非平凡初始化。

类型T对象的生命周期从以下时刻开始:

  • 存储器具有适合T类型的正确对齐和大小,并且
  • 如果对象有非琐碎初始化,则表示初始化完成。

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

  • 如果T是具有非平凡析构函数(12.4)的类类型,则开始析构函数调用,或者
  • 对象占用的存储空间被重用或释放。

这里他们说的是带有对象生命周期的简单或非简单复制/移动构造函数。有人能用一些例子程序来解释这个吗?

一个点的变化描述了类型为T的对象的生命周期何时开始,而没有提到T的生命周期何时结束。为什么?

这里他们说的是带有对象生命周期的简单或非简单复制/移动构造函数。有人能用一些例子程序来解释这个吗?

这只是语义。在所有情况下,这都可以翻译为"对象的生命周期从构造函数完成运行时开始"。这段引用只是为了彻底起见,因为琐碎的构造实际上不涉及任何这样的执行。

要给出一个"例子"来说明这一点并不容易;我可以向你展示平凡的和不平凡的构造函数,但它不会真正告诉你任何东西,所以我不打算。

一个点的变化描述了T类型对象的生命周期何时开始,但他们没有提到T何时结束。为什么?

是的,他们做了。现在应该更清楚了,我重新格式化了你问题中的引用。

一般来说,当一个对象的构造函数运行到完成,并且直到析构函数开始时,该对象才处于活动状态。

异常是那些非常微不足道的类型,以至于没有为它们运行构造函数,例如在代码

之后
int* p = (int*)malloc(1024);

你有一堆活着的int,即使它们没有以任何方式初始化,也没有执行任何构造函数。但是,它们仍然在那里,你可以给它们赋值。