【发布时间】:2011-08-27 12:34:06
【问题描述】:
在this answer 中,Ryan 直接调用了虚拟析构函数。我已经在 VS2010 中测试了代码,它正确地调用了所有的析构函数(用日志语句测试)。这样做真的有效吗?这种方法有什么问题、缺陷甚至优点?
我只能将其视为一种真正强制重置实际类型的方法,即使它们没有覆盖虚拟 reset 函数,因为它们至少必须在其析构函数中进行清理。
另外,调用析构函数究竟会带来什么样的副作用?在这样的析构函数调用之后使用对象是未定义的行为吗?如果立即通过new (this) MyClass(); 调用重新初始化它会怎样?
【问题讨论】:
-
适用于直接析构函数调用的规则与适用于使用 delete 的规则相同。
-
new (this) MyClass();基本上是在调用析构函数(即重构它)之后你可以对对象做的唯一事情。 -
@dribeas: 甚至这有点可疑 - 如果构造函数不能失败,那么你就可以逃脱它(尽管对于非 POD 类的 IIRC,你仍然使指针和对对象的引用无效,虽然我可能记错了)。但是那个问题是关于“数千行代码”的,所以我猜其中一个可能会失败。您留下了一个未构造的对象。所以你不能从
reset()返回或扔掉,因为如果你这样做了,那么以后有人会(无效地)试图摧毁它。可能你可以terminate(). -
@SteveJessop "你仍然使指向对象的指针和引用无效,虽然我可能记错了"你记错了
-
@curiousguy:我想我指的是 C++03 的 3.8/7:这些引用仍然有效的条件非常复杂。
标签: c++ virtual-destructor self-destruction