在调用析构函数之前,对象的生命周期结束了吗?

Pub*_*bby 11 c++ destructor object-lifetime language-lawyer

我不明白这个:

3.8/1"类型T的对象的生命周期在以下情况下结束: - 如果T是具有非平凡析构函数(12.4)的类类型,则析构函数调用开始,或者 - 对象占用的存储器被重用或释放. "

如果生命周期在析构函数启动之前结束,那是不是意味着访问析构函数中的成员是未定义的行为?

我也看到了这句话:

12.7"对于具有非平凡析构函数的对象,在析构函数完成执行后引用该对象的任何非静态成员或基类会导致未定义的行为."

但它并不清楚析构函数中允许的内容.

cur*_*guy 9

如果生命周期在析构函数启动之前结束,那是不是意味着访问析构函数中的成员是未定义的行为?

希望不是:

从N3242 构建和销毁[class.cdtor]/3

要形成指向对象obj的直接非静态成员(或访问其值)的指针,obj的构造应该已经开始并且它的销毁不应该完成,否则计算指针值(或访问成员) value)导致未定义的行为.


And*_*ite 7

对象的"生命周期"与对象的消费者相关,而不是对象本身.因此,一旦破坏开始,消费类不应尝试访问对象的成员.

  • "消费者"这个更常见的术语是"客户". (3认同)
  • “消费对象”是什么意思? (2认同)

Ker*_* SB 5

不,没有问题:

成员对象在构造函数体运行之前变为活动状态,并且在析构函数完成之后保持活动状态.因此,您可以在构造函数和析构函数中引用成员对象.

在自己的构造函数完成之后,对象本身才会生效,并且一旦析构函数开始执行就会死掉.但这只是外界所关注的问题.构造函数和析构函数仍然可以引用成员对象.

  • @Pubby:你必须非常小心你在构造函数和析构函数中使用`this`做什么,因为它不指向活动对象.基本上,"不要使用它"适用.存储指针很好,但是引用可能的对象不是. (3认同)
  • 这是否意味着这将无效?:`constructor(){outside_function(this); }`(也可以是析构函数) (2认同)
  • 但是如何在不使用`this`的情况下访问成员(假设它被隐式添加)?`constructor(){this-> x = 0; 这 - > MFUN(); }` (2认同)
  • @Pubby:构造函数可以引用成员对象(如果愿意,可以"使用`this`").构造函数不能做的是调用一个外部函数`foo(*this)`,它需要一个(完全构造的)对象. (2认同)