Clarification about object lifetime in destructor(关于析构函数中对象生存期的说明)
问题描述
Another question引用C++标准:
3.8/1&q;类型T的对象的生存期在以下情况结束:-如果T是具有非平凡析构函数的类类型(12.4),则析构函数调用 开始,或者-对象占用的存储被重复使用,或者 已发布。&Quot;
这似乎意味着不允许从析构函数访问对象的成员。然而,这似乎是错误的,事实更像是Kerrek SB的回答中所解释的:
成员对象在构造函数体运行之前激活,并且它们 在破坏者完成之前保持活体状态。因此,您可以 引用构造函数和析构函数中的成员对象。 对象本身直到在其自己的构造函数之后才会激活 结束,只要析构函数开始执行,它就会死亡。但 这只是外界关心的问题。构造函数和 析构函数仍可以引用成员对象。
我想知道在析构函数中是否可以将对象的地址传递给外部类,如:
struct Person;
struct Organizer
{
static void removeFromGuestList(const Person& person); // This then accesses Person members
}
struct Person
{
~Person() {
// I'm about to die, I won't make it to the party
Organizer::removeFromGuestList(*this);
}
};
这对我来说似乎没有问题,因为我认为对象的生命周期一直持续到析构函数结束之后,但上面答案的这一部分让我产生了怀疑:
对象本身直到在其自己的构造函数之后才会激活 结束,在其析构函数开始执行时立即终止。但是 这只是外界关心的问题。构造函数和 析构函数仍可以引用成员对象。
推荐答案
在析构函数执行期间类成员的确切状态方面,C++标准似乎确实有点自相矛盾。
然而,以下摘录自Draft C++ Standard可能可以保证您对removeFromGuestList
函数的调用应该是安全的(我添加了粗体斜体格式):
15.7构建和销毁
1用于具有非平凡构造函数的对象,指的是任何非静态成员或基 在构造函数开始执行之前,对象的 未定义的行为。对于具有非平凡析构函数的对象, 引用对象的任何非静态成员或基类 析构函数完成执行导致未定义的行为。
尚不清楚(至少对我而言)的是,一旦析构函数开始执行,通过引用被销毁的对象来引用这些类成员是否有效。也就是说,假设您的Person
类有一个成员,ObjectType a
在您的removeFromGuestList
函数中引用的person.a
有效吗?
另一方面,与其将*this
作为其参数传递,不如将每个必需的成员作为‘DISTINCT OBJECT’传递,则将是安全的;因此,将该函数重新定义为removeFromGuestList(const ObjectType& a)
(可能带有其他参数)将是完全安全的。
这篇关于关于析构函数中对象生存期的说明的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:关于析构函数中对象生存期的说明
基础教程推荐
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++,'if' 表达式中的变量声明 2021-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01