C++ 和虚拟析构函数

标签 c++ memory-management virtual new-operator

我正在一个应用程序中编写一个实用程序类,它们可能是也可能不是 future 的派生类。我没有任何虚函数(使用虚拟 dtor 的一般准则),因此考虑到我的内存限制,我选择在这个实用程序类中不使用虚拟析构函数。

一些程序员后来 - 有人通过从它派生来添加到我的实用程序类。现在,如果在代码的任何地方,我在 new'd 中的新类和删除的正确的 dtor 将不会被调用,因为基类 dtor 没有被虚拟化(参见示例代码)。

除了返回并更改基类之外 - 在这种情况下还有什么解决方案?

#include <iostream>
using namespace std;

class utility {
  int i, j;

  public:
    utility () { cout << "utility ctor\n";};
   ~utility () { cout << "utility dtor\n";};
    void dosomething () { cout << "haha\n";};
};

class addtoutility: public utility  {
  char *ch;

  public:
   addtoutility () { ch= new char(); cout << "added ctor\n";};
  ~addtoutility () { delete ch; cout << "added dtor\n";};
   void andnowaddsomefunctionality () {};
};

int main () {
  utility *u  = new addtoutility();
  //lots of interesthing code
  delete u;
}

最佳答案

您的基类不是多态的,因此在任何情况下拥有指向基的指针都没有什么值(value)。您的基类通过不在任何地方使用 virtual 关键字来证明它不是多态的。

如果有人想将它用作多态层次结构的基类,那么他们可以将 virtual 析构函数添加到他们从中派生的第一个类,并在必要时保存指向该基类的指针类型。

你不能阻止后来的程序员自己挖陷阱,但非多态类并没有错,你不需要对它做任何事情来“让它安全”。

作为证明这是普遍且可接受的做法的证据,您只需看一下标准库。有许多类(严格地说,它们中的大多数是类模板)没有虚函数,也没有虚析构函数。

关于C++ 和虚拟析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8262669/

相关文章:

c++ - 如何将 IWICBitmapSource 转换为 HBITMAP?

C++ - 将 RGB 一维数组转换为 OpenCV Mat 图像

c++ - 从纯虚拟(接口(interface))类虚拟继承是一个很好的约定吗?

java - JVMTI 分析 : calculating the amount of stack memory

login - Genymotion凭证。我无法登录 Sprite 运动凭证

c++ - 处理 websocketpp 连接路径

c - 如何管理插入和删除内容的内存?

具有单例属性的 iPhone 内存管理

c++ - C++中虚继承和简单继承的区别

.net - 在 .NET 中实现虚拟文件系统