1

ここのコードスニペットで分離するのが難しい特定のケースがありますが、それを説明することができます...

私はクラスAを持っています:パブリックBとAはあるタイプのメンバーポインタを持っていますfoo*f。Aの仮想デストラクタには、次のようなものがあります。

A::~A() { shutdown(); }

ここで、shutdownは非仮想であり、次のようになります。void A :: shutdown(){delete f;}

実行時に、これにより「アクティブな例外なしで呼び出された終了と呼ばれる純粋仮想メソッドが中止されました(コアダンプ)」が得られますが、デストラクタの本体からshutdown()を削除して直接呼び出し、デストラクタを実行させると...私はもうこれを取得しません...

この種の動作を引き起こしている可能性があるのは何ですか?gdbを使ってステップしてみましたが、それは巨大で、何を探すべきかさえわかりません。どんなアイデアでも大歓迎です!

4

2 に答える 2

0

継承ツリーのどこかshutdownにある純粋仮想関数であるか、継承ツリーのどこかにある純粋仮想関数である別のメンバー関数を呼び出します。直接的または間接的に、しかしそれが起こります。

実行パスをチェックして、呼び出しが行われた場所を確認し、それを取り除きます。

于 2011-09-29T01:18:25.367 に答える
0

Aにシャットダウンメソッドとポインタfの両方がある場合は、shutdown()をまったく呼び出さないでください。デストラクタのfを直接削除するだけです。

于 2011-09-29T01:56:13.273 に答える