0

私はゲームエンジンに取り組んでおり、以前の質問では、ポインタのリストを維持するために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のデストラクタも呼び出されることを確認しました。

どんな助けでも大歓迎です、私は空のメモリリークレポートを見たいです:-)

4

2 に答える 2

2

それは確かにあなたが漏らしているベクトルのようには見えません。文字列は読み取り可能であることに注意してください。これは少なくとも1つのヒントです。

中括弧の間にある安定した数字( "{173}")を取得できる場合は、メモリが割り当てられたときにブレークポイントを取得できます。これをmain()関数に入れます:

_crtBreakAlloc = 173;

#include <crtdbg.h>必要に応じて使用してください。174を繰り返して、もう1つを見つけます。

于 2010-07-13T21:48:10.997 に答える
0

ええと、あなたのコードはおそらく100%合法です。同じ問題がありますが、Valgrindに問題があり、boost::ptr_vectorも使用しています。以下は、テスト用のプロトタイプです。

#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/shared_ptr.hpp>
#include <map>

using namespace std;
class Object
{
    public:
        Object(){ abc=1;};
        ~Object(){cout<<"destructor Object"<<endl;};
        int abc;
};

class test : public boost::ptr_vector<Object>
{
    public:

        test(){}
        virtual ~test(){cout<<"destructor test"<<endl;}
        void add(){
            PARENT::push_back(new Object());
        }
    protected:

        typedef boost::ptr_vector<Object> PARENT;
        test(const test& abc);
};

    typedef boost::shared_ptr<test> shared_type;
    typedef std::map< int, std::pair<shared_type, shared_type> > maptype;

    maptype::mapped_type get()
    {
        boost::shared_ptr<test> testObj(new test);
        boost::shared_ptr<test> testObj2(new test);

        test &ref= *(testObj.get());
        test &ref2= *(testObj2.get());

        ref.reserve(4);
        ref.add();
        ref.add();
        ref.add();
        ref.add();
        ref2.reserve(4);
        ref2.add();
        return maptype::mapped_type(testObj,testObj2);
    }

int main() {
    std::map< int, std::pair<shared_type, shared_type> > mapped;
    mapped.insert(maptype::value_type(1,get()));

    return 0;
}

ここでいくつかの内部構造をテストしていたので、設計は気にしないでください。出力は次のとおりです。

destructor test
destructor Object
destructor test
destructor Object
destructor Object
destructor Object
destructor Object

Valgrindはここでも文句を言うことができます、私はそれがptr_vectorによるものだと思います

于 2015-01-27T15:25:34.530 に答える