Pub*_*bby 11 c++ destructor object-lifetime language-lawyer
我不明白这个:
3.8/1"类型T的对象的生命周期在以下情况下结束: - 如果T是具有非平凡析构函数(12.4)的类类型,则析构函数调用开始,或者 - 对象占用的存储器被重用或释放. "
如果生命周期在析构函数启动之前结束,那是不是意味着访问析构函数中的成员是未定义的行为?
我也看到了这句话:
12.7"对于具有非平凡析构函数的对象,在析构函数完成执行后引用该对象的任何非静态成员或基类会导致未定义的行为."
但它并不清楚析构函数中允许的内容.
如果生命周期在析构函数启动之前结束,那是不是意味着访问析构函数中的成员是未定义的行为?
希望不是:
从N3242 构建和销毁[class.cdtor]/3
要形成指向对象obj的直接非静态成员(或访问其值)的指针,obj的构造应该已经开始并且它的销毁不应该完成,否则计算指针值(或访问成员) value)导致未定义的行为.
对象的"生命周期"与对象的消费者相关,而不是对象本身.因此,一旦破坏开始,消费类不应尝试访问对象的成员.
不,没有问题:
成员对象在构造函数体运行之前变为活动状态,并且在析构函数完成之后保持活动状态.因此,您可以在构造函数和析构函数中引用成员对象.
在自己的构造函数完成之后,对象本身才会生效,并且一旦析构函数开始执行就会死掉.但这只是外界所关注的问题.构造函数和析构函数仍然可以引用成员对象.