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

时间:2013-11-18 10:50:08

标签: c++ this destructor

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

7 个答案:

答案 0 :(得分:7)

  

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

  

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

不,此时基类仍然完好无损。 派生类的成员(可能还有其他基类)已经被销毁,但是这个类的成员和基类在析构函数完成之前一直存在。

  

但是还有其他限制吗?

根据当前被销毁的类调度虚函数,而不是前一个派生类。所以要小心调用它们,特别是不要在这个类中调用任何纯虚函数。

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

出于显而易见的原因,你不能从析构函数中delete this

  

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

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

答案 1 :(得分:4)

作为answered here,它完全有效。

但你应该避免使用calling virtual functions

答案 2 :(得分:3)

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

派生类 已消失,因此特别是虚拟调用无法到达派生类。

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

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

[*]好吧,你可以构建一个析构函数来记录某个地方的机制 发生了什么,但班级用户必须积极检查。这不太可能带来愉快的用户体验。

答案 3 :(得分:1)

我在析构函数中使用this时没有看到任何问题。此时,物体仍在那里。析构函数用于在销毁对象之前释放现有资源。

但要避免调用虚函数。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

析构函数是一种方法,在对象被物理破坏之前称为,这样您就可以正确地对其进行取消初始化。为此,您必须才能访问其字段,因此您可以通过关键字安全地访问它们。

析构函数的顺序与构造函数相反,因此当析构函数运行时,基类的析构函数尚未运行 - 您应该可以访问其所有字段。另一方面,派生类的析构函数已经运行,因此 - 例如 - calling virtual or abstract methods可能会导致未定义的行为。

另外,请记住,这对throw exceptions in destructors来说非常危险。如果这样做,则可能会终止您的申请。

答案 6 :(得分:1)

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