没有虚拟析构函数可能会发生内存泄漏?

Alo*_*lok 11 c++ polymorphism dynamic-memory-allocation virtual-destructor

#include <iostream>
using namespace std;
class base
{
   int a;
 public: 
   base() {a =0;}
 };
 class derv :public base
 {
   int b;
  public:
   derv() {b =1;}
 };
 int main()
 {
    base *pb = new derv();
    delete pb;
 }
Run Code Online (Sandbox Code Playgroud)

我在derv类中没有虚拟析构函数,它只删除了derv对象的基本部分吗?

Jam*_*lis 21

它可能.

因为base没有虚拟析构函数,所以您的代码会显示未定义的行为.什么都可能发生.它可能看起来像你期望的那样工作.它可能泄漏内存.它可能会导致您的程序崩溃.它可能会格式化您的硬盘.

要求引用.C++11§5.3.5/ 3指出,对于标量delete表达式(即,不是delete[]表达式):

如果要删除的对象的静态类型与其动态类型不同,则静态类型应为要删除的对象的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义.

静态类型(base)与动态类型(derv)不同,静态类型没有虚拟析构函数,因此行为未定义.

  • @Xion:真的.行为未定义.所有赌注都已关闭.关于该计划的行为,没有什么可以确定的. (6认同)
  • base中缺少虚拟析构函数意味着派生类的析构函数中指定的任何自定义终结都不会执行.对象的内存仍然可以正确释放.(如果由非虚拟定义的话,`base`的析构函数也会被调用). (2认同)
  • 请参考! (2认同)
  • @wilhelmtell:这是标准的.这是未定义的行为. (2认同)