析构函数中关于"this"的用法

14

在析构函数中使用this参数来调用某个函数是否有效? 该函数不存储指针,但假定对象处于完全功能状态。


1
对象在 DTOR 的最后一行之前是完全有效的。当然,如果 DTOR 本身拆除了对象的某些部分(例如将 ptr 置空等),那么你就会自食其果,但这完全取决于你的代码,而不是 cpler 生成的代码... - Remus Rusanu
2个回答

19

this在析构函数中仍然有效。

但是,你需要记住,一旦对象被销毁,在虚函数中使用可能不会像你期望的那样正常工作;参见例如构造和析构期间切勿调用虚函数。基本上,每当析构函数完成时,对象的动态类型会发生改变。


4
它们确实能正常工作,只是“正常工作”的定义不同。我是说——它们按照设计的方式运行。 - valdo
2
无论如何,委员会对“正常工作”的定义在实践中并不是非常有用。我相信可能会发明一些用例,在其中您确实希望在基本ctor / dtor中调用虚拟函数的基类版本,并且委员会心中也有这样的想法。否则,他们会给予实现更多的自由,并仅表示调用是UB。那可能会更有效率,因为实现不必在每个dtor完成时不断调整vtable指针(或等效物)。就目前而言,我们为我们不使用的东西付出代价。 - Steve Jessop
@SteveJessop:当编译器可以证明您没有进行虚函数调用时,不需要重新排列vtable。这通常是可能的,但并不常见。 - MSalters

3
一句话总结:是的。
在 D`TOR 中使用 this 是完全有效的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接