【问题标题】:Uses of a Virtual destructor in C++(other than desctruction order correctness) [duplicate]C ++中虚拟析构函数的使用(除了析构顺序正确性)[重复]
【发布时间】:2016-10-03 15:49:15
【问题描述】:

每个 C++ 程序员都知道,虚拟析构函数用于确保继承层次结构中对象的正确销毁顺序。

“虚拟析构函数”还能在哪些地方使用/可以在实时场景中使用?

【问题讨论】:

  • 你从哪里得到每个 C++ 程序员都知道,虚拟析构函数用于确保继承层次结构中对象的正确销毁顺序。?这不是虚拟析构函数的用途。
  • “实时场景”而不是?

标签: c++ virtual virtual-destructor


【解决方案1】:

您的假设不正确;成为virtual 不会影响破坏顺序。那总是从大多数派生到基类。它确实会影响实际调用的析构函数!如果您不将析构函数声明为虚拟的,那么从大多数派生析构函数开始的完整析构函数链可能永远不会被调用。

如果没有虚拟析构函数,调用链将从指针或引用的静态类型的最派生类开始。如果您的实际对象是比这更多的派生类型,则会在跳过这些析构函数时出现未定义的行为。

例如:

class A { ... }; // base class
class B: public A { ... }; // derived class
class C: public B { ... }; // further derived

A* ABCFactory() { return new C; }

A* a = ABCFactory();
delete a;            // undefined behavior as destructors C and B are skipped

【讨论】:

  • "// 未定义的行为,因为析构函数 C 和 B 被跳过" 实际上,正如你所说,行为已经很好地定义了,~C() 和 ~B() 没有被调用,~A()是。
  • @UKMonkey: ...由于部分对象破坏而导致UB。
  • 啊,是的 - 是这样的......认为行为已经很好地定义了所有资源都被泄露,但事实并非如此。我的错。
猜你喜欢
  • 2016-08-14
  • 2020-07-06
  • 2012-10-24
  • 2017-01-27
  • 2020-04-08
  • 2011-08-12
  • 2014-11-04
  • 2017-08-13
  • 1970-01-01
相关资源
最近更新 更多