CWARN.DTOR.NONVIRT.NOTEMPTY

在类中继承虚拟函数,但析构函数不为虚拟和空

CWARN.DTOR.NONVIRT.NOTEMPTY 检查器会标记类声明虚拟成员函数继承自其基类,但其析构函数不为虚拟函数或空函数的类。

漏洞与风险

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

缓解与预防

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

漏洞代码示例

复制
   #include <iostream>
   using namespace std; 
    
   class A
   {
   public
    
       ~A() {std::cout << "I am A" << std::endl;}
       virtual void f1();
  };
   
  class B : public A
  {
  public
   
      ~B() {cout << "I am B" << endl;} 
      virtual void f1();
  };

在此代码示例中,类 A 中的非虚拟析构函数意味着,Klocwork 将标记第 16 行。