C++:我可以在析构函数中安全地使用它吗?
C++: Can I use this safely in a destructor?
今天的问题是:我可以在析构函数中使用this
吗,如果是,我必须遵守哪些限制......例如,我知道我不应该对基类做任何事情,因为它们已经消失了。但是还有哪些其他限制适用?我是否可以安全地假设this
(作为指针...即。内存地址...一个数字)与构造函数中的相同吗?
我可以在析构函数中使用
this
吗
是的。
例如,我知道我不应该对基类做任何事情,因为它们已经消失了。
不,此时基类仍然完好无损。派生类的成员(可能还有其他基类)已被销毁,但此类的成员和基类将保留到析构函数完成之前。
但是还有哪些其他限制适用?
虚函数是根据当前正在销毁的类而不是以前派生最多的类来调度的。因此,请小心调用它们,特别是不要调用此类中纯虚拟的任何函数。
不要将this
强制转换为派生类型,因为它不再是该类型的有效对象。
出于显而易见的原因,您无法从析构函数中delete this
。
我是否可以安全地假设这个(作为指针...即。内存地址...一个数字)与构造函数中的相同吗?
是的,对象的地址从其构造函数运行之前到其析构函数运行之后保持不变。
正如这里回答的那样,它是完全有效的。
但是,您应该避免调用虚拟函数。
基类在析构函数中没有消失,你可以正常使用它们。
派生类已消失,因此特别是虚拟调用不会到达派生类。
this
具有与构造函数和类中其他任何位置相同的值。
主要限制是不应允许任何异常离开析构函数。这意味着您无法指示失败[*]。通常,您应该只执行肯定会成功的操作(例如释放对象拥有的资源):您执行的任何可能失败的操作都必须可以忽略失败。你所做的任何可能抛出的东西,你都应该抓住异常。希望您已经完整记录了 this
的所有函数可能引发的异常,以便您知道您想用this
做的事情是否可以抛出。
[*] 好吧,您可以构建一种机制,让析构函数在某处记录发生了什么,但该类的用户必须主动检查它。这不太可能带来愉快的用户体验。
由于对象是从派生最多的类到基类的析构的,因此派生类析构函数已经执行。因此,您必须确保不要调用在 this
上派生类中重写的方法。除此之外,还好。
析构函数是一种方法,在对象被物理销毁之前调用,以便您可以正确取消初始化它。为此,您必须有权访问其字段,以便可以通过 this 关键字安全地访问它们。
析构函数的顺序与构造函数相反,因此当析构函数运行时,基类的析构函数尚未运行 - 您应该有权访问其所有字段。另一方面,派生类的析构函数已经运行,因此 - 例如 - 调用虚拟或抽象方法可能会导致未定义的行为。
此外,请记住,在析构函数中抛出异常是非常危险的。如果这样做,则可能会终止应用程序。
是的,您可以正常使用它。你那里有对象。
我认为在析构函数中使用this
没有任何问题。此时,对象仍然存在。析构函数用于在销毁对象之前释放现有资源。
但避免调用虚函数。
- 函数向量_指针有不同的原型,我可以构建一个吗
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 为什么我可以通过引用修改常量返回
- 我可以在 C++ 中的函数体之外进行操作吗?
- 我可以重新分配/覆盖std::字符串吗
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 为什么我可以使用比分配的内存更多的内存
- 我可以对 std::array 使用自定义分配器来获取安全加密密钥吗?
- 我可以在中断中写入向量,然后以安全的方式仅在主线程内读取吗?
- 我可以使用模板作为多态处理数组的安全解决方案
- 为什么我可以通过这样的字符串参数?这种样式安全吗?
- 我使用三种内存清除变体.他们都安全吗?我可以得到内存泄漏吗?
- 我可以制作一个线程安全的 std::atomic<vector<int>>吗?
- 我可以锁定列表中的一个元素以使其线程安全,而不是锁定整个列表吗?
- 我可以从random_device和mt19937的组合中生成加密安全的随机数据吗