1

SpriteX基本的に一般的なスプライトであるというクラスがあります。_Drawablesメンバーを持つというクラスもありstd::vector<SpriteX*>ます。私が作成したmain()すべてのスプライトで、コンテナに挿入してから_Drawables、メソッドを呼び出して、内のすべてのオブジェクトdrawAll()を描画できます。SpriteXstd::vector

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

4

4 に答える 4

3

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

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

しかし、デストラクタにいる場合は、すでにメモリを削除しているので、そうする必要はありませんよね? (つまり、デストラクタを明示的に呼び出していないことを願っています)

于 2012-04-14T20:21:07.507 に答える
1

使用するBoost::shared_ptr<>

したがって、ベクトルを次のように宣言します。

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

次に、イテレータを消去するか、エントリをクリアすると、参照カウントがゼロになり、メモリが解放されます。

すでにデストラクタにいる場合、デストラクタにいるので削除しても意味がありませんthis

于 2012-04-14T20:22:11.007 に答える
1

ここで車輪を再発明しようとしていますが、うまくいっていません (複雑な車輪です)。

ここではスマート ポインターを使用します。たとえばstd::unique_ptr(C++11 を使用している場合) またはboost::shared_ptr.

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

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

于 2012-04-14T20:22:50.963 に答える
1

何をしているかによっては、ポインターを完全に使用せずにstd::vector<SpriteX>.

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

std::vector<boost::shared_ptr<SpriteX> >を個別に関数に渡す場合SpriteX、または関数のライフサイクルが複雑な場合は、を使用します。ただし、それらが同じスコープで定義および削除される場合は、より単純なものに固執します。

于 2012-04-14T20:24:32.383 に答える