对象寿命问题:N3242草案

时间:2011-09-27 07:00:28

标签: c++ c++11 language-specifications

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

  

对象的生命周期是对象的运行时属性。 说一个对象   如果它是类或聚合类型,那么进行非平凡的初始化   或其中一个成员由一个非常重要的构造函数初始化   默认构造函数 [注意:由普通的复制/移动构造函数初始化   是非平凡的初始化。 - 结束说明]

     

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

     
      
  • 获得具有类型T的适当对齐和尺寸的存储,并且
  •   
  • 如果对象具有非平凡的初始化,则其初始化已完成。
  •   
     

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

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

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

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

2 个答案:

答案 0 :(得分:2)

  

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

这只是语义学。在所有情况下,这可以转换为“对象的生命周期在构造函数完成运行时开始”。引用是彻底的,因为琐碎的构造并不真正涉及任何这样的执行。

要说明这一点的“例子”并不容易;我可以向你展示琐碎和非平凡的构造函数,但它不会真正告诉你任何事情,所以我不会这样做。

  

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

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

答案 1 :(得分:1)

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

异常是非常简单的类型,没有为它们运行构造函数,例如在代码之后

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

你有一堆活着的int,即使它们没有以任何方式初始化,也没有执行构造函数。不过,他们在那里你可以为他们分配价值。