设计一个没有虚析构函数的多态类层次结构

时间:2014-01-08 00:13:05

标签: c++ performance polymorphism hierarchy virtual-destructor

我发现自己处于一种需要快速实例化和删除许多对象的情况,最终会占用大量的CPU和用户时间,因此我需要尽可能多地从该进程中删除。我确实意识到非虚拟析构函数不会是一个显着的收获,但它仍然可以节省几个百分点的时间,并且与其他一些优化一起将从用户的角度进行切实的改进。 / p>

我知道经验法则是,在这样的多态层次结构中,建议首先将析构函数设置为虚拟,以便在删除对象时运行相应的代码以执行所有必要的清理。

但是,如果调用哪个析构函数并不重要怎么办?如果需要收集的所有子类特定动态数据在特定构造函数中打包并实例化为专用于该目的的指针,那么该怎么办?" very-base-class"?在这种情况下,每个对象都可以实例化并访问它特定的加上继承的动态数据通过指针收集"通过基类析构函数可以内联,因此无论其实际内容和大小如何,动态内存将由操作系统解除分配,只需要地址而不关心大小,因此没有内存泄漏,没有开销虚拟电话。

那么,这听起来像个好主意吗?任何潜在的陷阱?

编辑:一个简单的测试:

class A {
  public:
  ~A() {cout << "A" << endl; }
};

class B : public A {
  public:
  ~B() {cout << "B" << endl; }
};

int main()
{
   A * a = new A;
   A * b = new B;
   B * br = new B;

   delete a;
   delete b;
   delete br;

   return 0;
}

输出:

A
A
B
A

因此无论删除什么指针,无论如何都会调用收集所有内存的基类析构函数。是否有可能发生其他事情?如果是的话何时以及为何?

1 个答案:

答案 0 :(得分:0)

一个非常大的陷阱,是的 - 未定义的行为。以下代码展示了它:

struct A
{};
struct B : A
{};

//....
A* a = new B;
delete a;

如果基类没有virtual析构函数,则删除指向派生类的基类指针会导致UB。如果您打算这样做,则需要virtual析构函数。