今天的问题是:我可以在析构函数中使用this
,如果是,我必须遵守的限制是什么......例如,我知道我不应该对基类做任何事情,因为他们走了。但是还有其他限制吗?我可以安全地假设this
(作为指针......即内存地址......一个数字)与构造函数中的相同吗?
答案 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
上调用派生类中重写的方法。除此之外,没关系。