-1

C++11 n3242“子对象的持续时间,对象生命周期”,3.8/1 中的一点:

对象的生命周期是对象的运行时属性。如果一个对象是一个类或聚合类型,并且它或它的一个成员由一个普通默认构造函数以外的构造函数初始化,则称该对象具有非普通初始化[注意:普通复制/移动构造函数的初始化是非普通的- 简单的初始化。——尾注]

T 类型对象的生命周期开始于:

  • 获得具有适合类型 T 的对齐和大小的存储,并且
  • 如果对象有非平凡的初始化,它的初始化就完成了。

T 类型对象的生命周期在以下情况下结束:

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

在这里,他们谈到了具有对象生命周期的琐碎或非琐碎的复制/移动构造函数。任何人都可以用一些示例程序来解释这一点吗?

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

4

2 回答 2

2

在这里,他们谈到了具有对象生命周期的琐碎或非琐碎的复制/移动构造函数。任何人都可以用一些示例程序来解释这一点吗?

这只是语义。在所有情况下,这都可以翻译为“对象的生命周期在构造函数完成运行时开始”。引用很详尽,因为琐碎的构造实际上并不涉及任何此类执行。

举一个“例子”来说明这一点并不容易;我可以向您展示微不足道的和非微不足道的构造函数,但它不会真正告诉您任何事情,所以我不打算这样做。

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

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

于 2011-09-27T07:09:07.683 回答
1

一般来说,当一个对象的构造函数运行完成并一直存活到它的析构函数开始时,一个对象是存活的。

一个例外是类型是如此微不足道,以至于没有为它们运行构造函数,例如在代码之后

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

你有一堆int活着的 s,即使它们没有以任何方式初始化,也没有执行任何构造函数。尽管如此,它们仍然存在,您可以为它们分配值。

于 2011-09-27T17:58:01.350 回答