私は趣味のC++プログラマーであり、これが私の最初の投稿です。
まず、クロスプラットフォームのansiC++に取り組んでいることをお伝えします。
私はちょうどメモリ管理を理解するために多くの仕事をしてきました、そして私はついにstd :: vectorを使用して、削除中に手動でポインタを管理するコツをつかみました。
また、私はboost :: smart_ptrを使用していて、ついにクリックされました。
しかし、コンストラクターがFooManager(シングルトン)に自分自身を登録するクラスFooがあるコードに出くわしました。
Foo::Foo()
{
FooManager::Instance()->register(this);
}
FooManagerの破棄中に、std :: vectorを繰り返し、各要素に消去と削除を適用して、Fooのメモリを効果的にクリーンアップします。
FooManager::~FooManager()
{
// iterate over the container of Foo pointers
// erase the pointer from container and delete the pointer
}
a)作成中にポインタをラップするためにboost :: smart_ptrを使用しておらず、b)コンストラクタとデストラクタでメモリ管理のトリックを使用しているため、混乱しました。
これは実行可能な解決策ですか、それともシングルトンのデストラクタを使用して管理対象のオブジェクトをクリーンアップすることに伴うひどい危険がありますか?
私自身のテストから、1つの根本的な欠点を発見しました。Fooはもうスタックに割り当てられるべきではありません。オブジェクトがスコープ外になると、オブジェクトはそれ自体を逆参照します。FooManagerのデストラクタが呼び出されると、FooManagerはそれを再度削除しようとします。これにより、アサートエラーが生成されます。
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse));
それが唯一の欠点ですか?マネージャーへの登録をFooコンストラクターの外に移動する必要がありますか?プログラムの寿命の終わりに手動で呼び出すメモリをクリーンアップするFooManagerの個別の関数が必要ですか?この問題についてどう思いますか?