私はゲームエンジンに取り組んでおり、以前の質問では、ポインタのリストを維持するためにboost::ptr_vectorの使用を開始することが提案されました。
基本的な考え方は、いくつかの州を持つことです。各州にはSceneGraphがあります。各状態には、初期化してから独自のSceneGraphを詰め込むいくつかのリソースがあります。SceneGraphには、リソースポインタを詰め込むboost::ptr_vectorがあります。
関連するコードは次のとおりです。
リソースの作成とTestStateでのSceneGraphへの追加
backgroundImage = new DEBUG_NEW Fenris::Node2D::Image(std::string("backgroundImage"), std::string("../media/img/background.jpg"));
sceneGraph->addNode(backgroundImage, Fenris::Core::STRATUM_BACK);
シーングラフ
boost::ptr_vector<SceneGraphNode> backStratumList;
// The add() method
void addNode(SceneGraphNode *pNode, STRATUM_TYPE stratumType) {
switch(stratumType) {
case STRATUM_BACK:
backStratumList.push_back(pNode);
break;
case STRATUM_NORMAL:
normalStratumList.push_back(pNode);
break;
case STRATUM_FOREGROUND:
foregroundStratumList.push_back(pNode);
break;
}
}
関連する行でmain.cppを編集しました
PlatformGame::State::TestState *testState = new DEBUG_NEW PlatformGame::State::TestState(std::string("testState"));
// Clean up the previously registered state (deletes its sceneGraph -- verified that the destructor is in fact called via debugger)
delete testState;
// Dump memleak report if we're running in debug mode
#ifdef _DEBUG
_CrtDumpMemoryLeaks();
#endif
_CrtDumpMemoryLeaks()を使用して、メモリリークログレポートを出力しています。ログレポートには、メモリリークがあることが示されています。
検出されたメモリリーク! オブジェクトのダンプ-> {174} 0x00A56630の通常のブロック、長さ32バイト。 データ:<../ media / img / bac> 2E 2E 2F 6D 65 64 69 61 2F 69 6D 67 2F 62 61 63 {173} 0x00A565A0の通常のブロック、長さ8バイト。 データ:<c> A8 63 A5 00 00 00 00 00 オブジェクトのダンプが完了しました。
_CrtDumpMemoryLeaks()でboost :: ptr_vectorに問題がありますか、それとも何か間違ったことをしましたか?デバッガーは、Stateがそのデストラクタ(sceneGraphを削除します)を呼び出すことを通知します。また、SceneGraphのデストラクタも呼び出されることを確認しました。
どんな助けでも大歓迎です、私は空のメモリリークレポートを見たいです:-)