C ++ 11 n3242“子对象的持续时间,对象生命周期”,3.8 / 1:
对象的生命周期是对象的运行时属性。 说一个对象 如果它是类或聚合类型,那么进行非平凡的初始化 或其中一个成员由一个非常重要的构造函数初始化 默认构造函数 [注意:由普通的复制/移动构造函数初始化 是非平凡的初始化。 - 结束说明]
T类对象的生命周期始于:
- 获得具有类型T的适当对齐和尺寸的存储,并且
- 如果对象具有非平凡的初始化,则其初始化已完成。
类型T的对象的生命周期在以下时间结束:
- 如果T是具有非平凡析构函数(12.4)的类类型,则析构函数调用开始,或
- 对象占用的存储空间被重用或释放。
他们在这里谈到了具有对象生命周期的琐碎或重要的复制/移动构造函数。有人可以用一些示例程序来解释这个吗?
点的更改描述了类型为T
的对象的生命周期何时开始,但是他们没有提到T
何时结束。为什么呢?
答案 0 :(得分:2)
他们在这里谈到了具有对象生命周期的琐碎或重要的复制/移动构造函数。有人可以用一些示例程序来解释这个吗?
这只是语义学。在所有情况下,这可以转换为“对象的生命周期在构造函数完成运行时开始”。引用是彻底的,因为琐碎的构造并不真正涉及任何这样的执行。
要说明这一点的“例子”并不容易;我可以向你展示琐碎和非平凡的构造函数,但它不会真正告诉你任何事情,所以我不会这样做。
点的变化描述了类型T的对象的生命周期何时开始,但是当T结束时它们没有提到。为什么呢?
是的,他们做到了。现在应该更清楚了,我在你的问题中重新格式化了引用。
答案 1 :(得分:1)
一般来说,当一个对象的构造函数运行完成并且直到它的析构函数开始时,它仍处于活动状态。
异常是非常简单的类型,没有为它们运行构造函数,例如在代码之后
int* p = (int*)malloc(1024);
你有一堆活着的int
,即使它们没有以任何方式初始化,也没有执行构造函数。不过,他们在那里你可以为他们分配价值。