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

Lifetime of object is over before destructor is called?

本文关键字:结束了 析构函数 调用 生命 周期 对象      更新时间:2023-10-16

我不明白:

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

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

我也看到了这句话:

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

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

希望不是:

源自N3242 构造和销毁[class。cdtor] /3

要形成指向对象obj的直接非静态成员的指针(或访问其值),obj的构造必须已经开始,且还没有完成对其的销毁,否则指针值的计算(或访问成员值)将导致未定义行为。

对象的"生存期"与对象的消费者相关,而与对象本身无关。因此,一旦销毁开始,消费类不应该尝试访问对象的成员。

不,没有问题:

成员对象在构造函数体运行之前是活动的,并且在析构函数结束之前一直是活动的。因此,可以在构造函数和析构函数中引用成员对象。

对象本身直到它自己的构造函数完成后才会激活,并且在它的析构函数开始执行时它就会死亡。但这只是外界所关注的。构造函数和析构函数仍然可以引用成员对象。

"Lifetime"不是这个意思。在标准中,它是一个精确定义的术语,有很多含义,但它可能不像你想象的那样有所有含义。成员仍然可以在构造和销毁过程中使用,外部代码可以调用成员函数,等等。

诚然,客户机代码与析构函数并发地调用成员函数有点奇怪,但不是没有听说过,当然也不是语言不允许的。特别是,std::condition_variable显式地允许在对condition_variable::wait()有未完成的调用时调用析构函数。它只禁止在析构函数启动后对wait()new调用。