CWARN.DTOR.NONVIRT.DELETE

删除含虚拟方法且无虚拟析构函数的类的表达式

CWARN.DTR.NONVIRT.DELETE 检查器可查找类中具有虚拟方法却无虚拟析构函数的对象的删除。

漏洞与风险

当通过指向基类的指针删除从该基类派生的类的对象时,该派生类的析构函数不会执行,派生类的成员也不会得到恰当处理。这种情况可能导致内存泄漏和资源未释放。

缓解与预防

在包含一个虚拟方法以及某些必须进行恰当的隐式或显式处理的成员数据的类中,务必提供一个虚拟析构函数,即使该函数为空。派生类将从基类继承,如果基类析构函数未定义为虚拟函数,内存将无法恰当解除分配。在声明或重写虚拟函数的类的层次结构中,对于该层次结构的根类,虚拟析构函数只能定义一次。

漏洞代码示例

复制
   class A
   {
   public
    
       ~A() {cout << "I am A" << endl;}
       virtual void f1();
   };
    
   class B : public A
  {
  public
   
      virtual ~B() {cout << "I am B" << endl;}
      virtual void f1();
  };
   
  void foo() {
      A *a = new B;
      delete a; 
  }

在此代码示例中,类 A 中缺少虚拟析构函数意味着,Klocwork 将在第 19 行标记删除操作。