2

次のコードを考えてみましょう。

#include <iostream>

struct A{ virtual void foo(){ } };

struct B : A { virtual void foo(){ } };

A *a = new B;


int main()
{
    delete a; //UB?
}

意図的に仮想デストラクタを定義しませんでした。コンパイラは UB の原因に関するメッセージを出力しましたが、それは本当ですか?

4

1 に答える 1

5

最も派生した型ではない T へのポインターを介して削除する場合、正式には UB があり、T には仮想デストラクタがありません。

実際には、データ メンバーがなければ問題はありませんが、それでも非常に良くない不必要な方法です。

注: を使用するshared_ptrと、初期化の時点で削除関数が作成され、その削除関数は元の型を記憶できます。その型が最も派生した型である場合、明確に定義された削除が保証されます。たとえば、あなたの場合shared_ptr<A> p( new B );は問題ありません。

于 2015-04-25T06:04:06.223 に答える