2012-04-14 7 views
1

私は基本的に汎用スプライトであるSpriteXというクラスを持っています。私は_Drawablesというクラスを持っていて、メンバーはstd::vector<SpriteX*>です。 main()では、作成したすべてのスプライトを_Drawablesコンテナに挿入してからdrawAll()メソッドを呼び出して、std::vectorのすべてのSpriteXオブジェクトを描画することができます。このクラスへのポインタをクラスから削除しますか?

SpriteXオブジェクトは、自身へのポインタがどのインデックスにあるかを知っており、デストラクタではポインタをNULLに設定します。しかし、ポインタを完全に破棄したいのですが、NULLに設定するだけではありません。しかし、ポインタを安全に削除していますか?デストラクタでdeleteを使用し、そのデストラクタを呼び出すと、ループが発生しますか?メモリを解放する方法はありますか?

+1

サイドノート: '_Drawables'という名前はC++では不正です。そのクラスの名前を変更する必要があります。アンダースコア+大文字で始まる名前は実装用に予約されています。 – Philipp

答えて

3

デストラクタでdeleteを使用し、デストラクタを呼び出すとループが発生しますか?

はい、おそらくスタックオーバーフローとクラッシュが発生します。

デストラクタを使用している場合、既にメモリを削除しているので、その必要はありません。

std::vector<boost::shared_ptr<SpriteX> > 

その後イテレータを消去またはエントリクリアしたとき:使用Boost::shared_ptr<>はそうであるためにあなたのベクトルを宣言

+1

デストラクタ自体は "メモリを削除"しません。単にオブジェクトの破壊ロジックを実行します。メモリはオブジェクトのデストラクタを呼び出した後に 'delete' *によって解放されます。 –

+0

いいえ、そうではありません。 'MyClass ::〜MyClass'を手動で呼び出すこともできます。たとえば、いくつかの状況では意味があります(新しい配置など)。 – bitmask

+0

デストラクタがメモリを解放しないことを知っています。末尾に私の質問があります。 –

1

(のように、明示的に、私は願ってデストラクタを呼び出していません)参照カウントはゼロになり、メモリは解放されます。

デストラクタに既に入っている場合は、デストラクタにあるようにthisを削除することは意味がありません。

1

あなたはここでホイールを再発明しようとしていますが、あなたはそれをうまくやっていません(複雑なホイールです)。

ここではスマートポインタを使用します。 std::unique_ptr(C++ 11の場合)またはboost::shared_ptr

デストラクタでdeleteを使用し、デストラクタを呼び出すとループが発生しますか?

はい。そして、それは意味をなさない...デストラクタは最初にどのように呼び出されますか?あなたは実際に手動でポインタ上のデストラクタを呼び出していますか?それは可能ですが、それはおそらく非常に悪い考えです。

1

何をしているかによって、ポインタを完全に捨てて、std::vector<SpriteX>だけを使用することができます。

また、ポインターを持ちたいが、末尾がmain()になるまでクリアしない場合は、boost::ptr_vectorと考えてください。 std::vector<>と同じ構文を使用しますが、ポインタを使用する場合はpush_backにする必要があります。さらに、あなたのポインタの所有権を取るので、それらを削除することについて心配する必要はありません。

SpriteXを個別に関数に渡す場合や、ライフサイクルが複雑な場合は、std::vector<boost::shared_ptr<SpriteX> >を使用してください。彼らが同じ範囲で定義され、削除されても、私はもっと単純なものに固執します。

+0

問題は、実際のオブジェクトでmove-typeメソッドを呼び出すと、 '_Drawables'クラスは' SpriteX'オブジェクトごとに 'draw()'を明示的に呼び出さないようにします – rcplusplus

関連する問題