CXX.CWARN.DTOR.NONVIRT

デストラクターは virtual として宣言する必要があります。

そうしないと、基本クラスハンドルを使用して派生クラスを削除する場合、予期しない動作が発生する可能性があります。

脆弱性とリスク

派生クラスは、メモリを割り当てたり、オブジェクトの破棄時にクリーンアップされる必要がある他のリソースへの参照を保持したりできます。インターフェイス/抽象クラスに仮想デストラクタを指定しないと、基本クラスハンドルを介して派生クラスインスタンスを削除するたびに派生クラスのデストラクタが呼び出されず、結果としてメモリリークまたはリソースリークが発生する可能性があります。

軽減と防止

常にデストラクタを virtual と宣言してください。

コピー
class Base 
{
    // some virtual methods
};

class Derived : public Base
{
    ~Derived()
    {
        // Do some important cleanup
    }
}

Base *b = new Derived();
// use b
delete b; // Here's the problem! 

Base のデストラクタは virtual ではなく、b は Derived オブジェクトを指す Base* であるため、delete b は定義されていない動作を引き起こします。ほとんどの実装では、デストラクタの呼び出しはあらゆる非仮想コードと同様に解決されます。つまり、基本クラスのデストラクタは呼び出されますが、派生クラスのデストラクタは呼び出されず、リソースリークが発生します。