对象的生命周期在调用析构函数之前就结束了
Lifetime of object is over before destructor is called?
我不明白:
3.8/1 "类型T的对象的生命周期在以下情况结束:-如果T是具有非平凡析构函数(12.4)的类类型,析构函数调用启动,或者-对象占用的存储空间被重用或者释放。"
如果生命周期在析构函数开始之前结束,这是否意味着访问析构函数中的成员是未定义的行为?
我也看到了这句话:
12.7 "对于具有非平凡析构函数的对象,在析构函数之后引用对象的任何非静态成员或基类完成执行导致未定义行为。"
如果生命周期在析构函数开始之前结束,这是否意味着访问析构函数中的成员是未定义的行为?
希望不是:
源自N3242 构造和销毁[class。cdtor] /3
要形成指向对象obj的直接非静态成员的指针(或访问其值),obj的构造必须已经开始,且还没有完成对其的销毁,否则指针值的计算(或访问成员值)将导致未定义行为。
对象的"生存期"与对象的消费者相关,而与对象本身无关。因此,一旦销毁开始,消费类不应该尝试访问对象的成员。
不,没有问题:
成员对象在构造函数体运行之前是活动的,并且在析构函数结束之前一直是活动的。因此,可以在构造函数和析构函数中引用成员对象。
对象本身直到它自己的构造函数完成后才会激活,并且在它的析构函数开始执行时它就会死亡。但这只是外界所关注的。构造函数和析构函数仍然可以引用成员对象。
"Lifetime"不是这个意思。在标准中,它是一个精确定义的术语,有很多含义,但它可能不像你想象的那样有所有含义。成员仍然可以在构造和销毁过程中使用,外部代码可以调用成员函数,等等。
诚然,客户机代码与析构函数并发地调用成员函数有点奇怪,但不是没有听说过,当然也不是语言不允许的。特别是,std::condition_variable
显式地允许在对condition_variable::wait()
有未完成的调用时调用析构函数。它只禁止在析构函数启动后对wait()
的new调用。
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- 当声明了虚拟析构函数但没有实现时会发生什么情况
- C++析构函数调用了错误的对象
- 用return语句结束析构函数安全吗
- 尽管使用了 boost::scoped_ptr,我们是否应该删除析构函数中成员的指针
- 有人可以解释一下这里发生了什么(类和构造函数/析构函数)吗?
- 析构函数"Missing vtable",但定义了析构函数
- mfc应用程序结束后,CMainFrame的析构函数调用发生访问冲突
- 添加析构函数后,在程序调用它之前,我就出现了错误
- 我是否正确构建了这些引用和指针函数?如果是,我该如何显式调用我的析构函数
- boost::shared_ptr的析构函数阻止了唯一的线程
- 为什么析构函数在对象引用作为参数传递时函数范围结束后调用
- 如果在派生类中定义了虚拟析构函数,但不是层次结构的顶部,该怎么办?C++
- 在作用域结束之前调用了析构函数
- 在块程序结束时析构函数调用的顺序
- 对象的生命周期在调用析构函数之前就结束了
- 为什么不为定义了析构函数的类合成move操作呢?
- 如何检查线程中是否调用了析构函数
- 当派生函数定义了析构函数时,使用复制函数而不是移动函数
- 尽管调用了析构函数,但仍存在内存泄漏