2011-07-13 12 views
0

を継承しました。コードは正常にコンパイルされますが、実行するとクラッシュします。プロパティは公開されているので、継承された特性は私のためにいくつかのメモリを解放することができるでしょうか?の削除は、私は2つのクラスを持っているタイプ

+10

Bのdtorの実行時に自動的に呼び出されるクラスAのデストラクタでそれらを削除してはいけませんか? –

+2

また、ctorsとdtorsの実際のコードを投稿して、人々があなたがしようとしていることを推測する必要がないようにする必要があります。 –

+0

デストラクタは継承されていますか?しかし、コンストラクタはありませんか? – Saustin

答えて

0

それは私が、特に深刻なメモリリークを、それをコード化する方法にいくつかの問題が発生するので、私は、Aのコンストラクタ/デストラクタだけでなく、Bさんと呼ばれます。すべての助けをいただきありがとうございました、私はただのコンストラクタが継承されたことを私に伝える誰かのために混乱しました。

+0

いくつかのコメント:「クラスA」のdtorが仮想であることを望んでいるでしょう。そして、コンストラクタが継承されないという事実は、例えば、 'class A'がintパラメータをとるコンストラクタA :: A(int x);を持っていれば、そのクラスBは* 'B 'で明示的に宣言されていない限り、そのようなコンストラクタを持ちます。 –

0

別の質問が良いかどうかは分かるはずです。

あなたのコードはクラッシュしていると言いますが、BのデストラクタでAのmmeber変数を削除しているという証拠はありません。実際に私が推測しなければならなかったのは、現金の原因がAとBのコピーコンストラクタと代入演算子の欠如(いわゆる「ルール3」、google it)であると言うでしょう。

プログラムがクラッシュしている場合は、クラッシュするコードを投稿することをお勧めします。私はそれが役に立つ答えを得るあなたのチャンスを向上させると思う。

+0

彼はこの作業をする必要がないという仮想デストラクタを忘れないでください。 'A'のデストラクタは' virtual'なしで宣言されます。また、抽象クラスであるためには 'A'が必要なので、派生クラスでのみ使用できます(おそらく' A'が作成するものを破壊します)。 –

1

あなたの実際のコードに応じて、oに削除を呼び出すことはできません、それは二重削除xyzかもしれません。

基本クラス(基本クラスメンバの場合)と派生クラス(派生クラスメンバの場合)で破棄を正しく実装する必要があります。トリクルダウンのデストラクタ動作が基本クラスの破壊を処理するようにします。

http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.12

私は、派生クラスのデストラクタを書き、私は明示的に私の基本クラスのデストラクタを呼び出す必要がありますか?

  • ません... 派生クラスのデストラクタは、(あなたが明示的に定義するかどうかは)自動的に、あなたのコードが使用されている方法に応じて、また、基本クラスのサブオブジェクトのデストラクタ

を呼び出しますデストラクタを仮想化する必要があるかもしれません。

http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.7

ときに私のデストラクタは仮想すべきですか?

  • 誰かがベースクラスポインタを介して派生クラスオブジェクトを削除すると、誰かが削除されます。
関連する問題