私はC++メモリ管理をかなり新しくしています。私はShould every class have a virtual destructor?を読んで、この答えを見つけました:保護されたデストラクタを持つオブジェクトを削除する
あなたが公共の非を持っていればすべての抽象クラスが
- を保護デストラクタまたは
- 仮想デストラクタ
を持っている必要がありますどちらか仮想デストラクタ、それはユーザーがそのポインタを介して派生オブジェクトを削除することができますので、それは良いことではありません。私たち皆が知っているように、それは未定義の振る舞いです。
ポインタを使って削除しないクラスの場合、仮想デストラクタを持つ理由はありません。リソースを無駄にするだけでなく、重要なことに、ユーザーに間違ったヒントを与えることになります。ちょうどstd :: iteratorに仮想デストラクタを与えるのはどういう意味なのでしょうか。
私は今、保護されたデストラクタを持っています(私はクラスから派生していません)。
私はこのオブジェクトへのポインタを持っていますが、別のクラスです。私のコンストラクタでは、ポインタをそのクラスの「新しい」オブジェクトにします。私のdestrcutorで、それを破壊したいと思います。
どうすればよいですか?デストラクタが保護されていない場合、私はsegフォルトを取得します(これは完全に理解できませんが、とにかくプログラミングが悪いと思います)。デストラクタが保護されている場合、オブジェクトの削除方法はわかりません。
いいえ、デストラクタをパブリックにすると、そのオブジェクトを削除しようとするとsegfaultが発生します – jcuenod
私の問題は、削除するクラスのどこかにあることに気付いています。この時点で私はコンストラクタを考えています。 – jcuenod
いくつかのコードを表示する必要があります。 segfaultは組み込み構造からではなく、あなた自身のプログラミングからである可能性が最も高いです:) – filmor