C++:我可以在析构函数中安全地使用它吗?

C++: Can I use this safely in a destructor?

本文关键字:安全 我可以 析构函数 C++      更新时间:2023-10-16

今天的问题是:我可以在析构函数中使用this吗,如果是,我必须遵守哪些限制......例如,我知道我不应该对基类做任何事情,因为它们已经消失了。但是还有哪些其他限制适用?我是否可以安全地假设this(作为指针...即。内存地址...一个数字)与构造函数中的相同吗?

我可以在析构函数中使用this

是的。

例如,我知道我不应该对基类做任何事情,因为它们已经消失了。

不,此时基类仍然完好无损。派生类的成员(可能还有其他基类)已被销毁,但此类的成员和基类将保留到析构函数完成之前。

但是还有哪些其他限制适用?

虚函数是根据当前正在销毁的类而不是以前派生最多的类来调度的。因此,请小心调用它们,特别是不要调用此类中纯虚拟的任何函数。

不要将this强制转换为派生类型,因为它不再是该类型的有效对象。

出于显而易见的原因,您无法从析构函数中delete this

我是否可以安全地假设这个(作为指针...即。内存地址...一个数字)与构造函数中的相同吗?

是的,对象的地址从其构造函数运行之前到其析构函数运行之后保持不变。

正如这里回答的那样,它是完全有效的。

但是,您应该避免调用虚拟函数。

基类析构函数中没有消失,你可以正常使用它们。

派生类

消失,因此特别是虚拟调用不会到达派生类。

this具有与构造函数和类中其他任何位置相同的值。

主要限制是不应允许任何异常离开析构函数。这意味着您无法指示失败[*]。通常,您应该只执行肯定会成功的操作(例如释放对象拥有的资源):您执行的任何可能失败的操作都必须可以忽略失败。你所做的任何可能抛出的东西,你都应该抓住异常。希望您已经完整记录了 this 的所有函数可能引发的异常,以便您知道您想用this做的事情是否可以抛出。

[*] 好吧,您可以构建一种机制,让析构函数在某处记录发生了什么,但该类的用户必须主动检查它。这不太可能带来愉快的用户体验。

由于对象是从派生最多的类到基类的析构的,因此派生类析构函数已经执行。因此,您必须确保不要调用在 this 上派生类中重写的方法。除此之外,还好。

析构函数是一种方法,在对象被物理销毁之前调用,以便您可以正确取消初始化它。为此,您必须有权访问其字段,以便可以通过 this 关键字安全地访问它们。

析构函数的

顺序与构造函数相反,因此当析构函数运行时,基类的析构函数尚未运行 - 您应该有权访问其所有字段。另一方面,派生类的析构函数已经运行,因此 - 例如 - 调用虚拟或抽象方法可能会导致未定义的行为。

此外,请记住,在析构函数中抛出异常是非常危险的。如果这样做,则可能会终止应用程序。

是的,您可以正常使用它。你那里有对象。

我认为在析构函数中使用this没有任何问题。此时,对象仍然存在。析构函数用于在销毁对象之前释放现有资源。

但避免调用虚函数。