2012-01-08 12 views
1

私はC++メモリ管理をかなり新しくしています。私はShould every class have a virtual destructor?を読んで、この答えを見つけました:保護されたデストラクタを持つオブジェクトを削除する

あなたが公共の非を持っていればすべての抽象クラスが

  • を保護デストラクタまたは
  • 仮想デストラクタ

を持っている必要がありますどちらか仮想デストラクタ、それはユーザーがそのポインタを介して派生オブジェクトを削除することができますので、それは良いことではありません。私たち皆が知っているように、それは未定義の振る舞いです。

ポインタを使って削除しないクラスの場合、仮想デストラクタを持つ理由はありません。リソースを無駄にするだけでなく、重要なことに、ユーザーに間違ったヒントを与えることになります。ちょうどstd :: iteratorに仮想デストラクタを与えるのはどういう意味なのでしょうか。

私は今、保護されたデストラクタを持っています(私はクラスから派生していません)。

私はこのオブジェクトへのポインタを持っていますが、別のクラスです。私のコンストラクタでは、ポインタをそのクラスの「新しい」オブジェクトにします。私のdestrcutorで、それを破壊したいと思います。

どうすればよいですか?デストラクタが保護されていない場合、私はsegフォルトを取得します(これは完全に理解できませんが、とにかくプログラミングが悪いと思います)。デストラクタが保護されている場合、オブジェクトの削除方法はわかりません。

答えて

3

上記のブロックに「抽象」という用語がありません。 「抽象的な」とは、クラスのオブジェクトを持ってはいけないということです。あなたがクラスからのオブジェクトを持っているなら、それはほとんど常にパブリックデストラクターを持つべきです。

+0

いいえ、デストラクタをパブリックにすると、そのオブジェクトを削除しようとするとsegfaultが発生します – jcuenod

+0

私の問題は、削除するクラスのどこかにあることに気付いています。この時点で私はコンストラクタを考えています。 – jcuenod

+1

いくつかのコードを表示する必要があります。 segfaultは組み込み構造からではなく、あなた自身のプログラミングからである可能性が最も高いです:) – filmor

関連する問題