ptr_vector - _CrtDumpMemoryLeaks () - утечки памяти, даже если вызывается деструктор - PullRequest
0 голосов
/ 14 июля 2010

Я работаю над игровым движком, и в одном из предыдущих вопросов было предложено начать использовать boost :: ptr_vector для поддержки списка указателей.

Основная идея состоит в том, чтобы иметь несколько штатов, в каждом штате есть SceneGraph. Каждое состояние имеет несколько ресурсов, которые они инициализируют, а затем заполняют свой собственный SceneGraph. У SceneGraph есть boost :: ptr_vector, в который он вставляет указатели ресурсов.

Вот соответствующий код:

Создание ресурса и добавление к SceneGraph в TestState backgroundImage = new DEBUG_NEW Fenris::Node2D::Image(std::string("backgroundImage"), std::string("../media/img/background.jpg")); sceneGraph->addNode(backgroundImage, Fenris::Core::STRATUM_BACK);

* 1013 дерева сцены * boost::ptr_vector<SceneGraphNode> backStratumList;<br> // The add() method<br> 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"));<br> // Clean up the previously registered state (deletes its sceneGraph -- verified that the destructor is in fact called via debugger) delete testState;<br> // Dump memleak report if we're running in debug mode #ifdef _DEBUG _CrtDumpMemoryLeaks(); #endif

Я использую _CrtDumpMemoryLeaks () для вывода отчета журнала утечек памяти. В отчете говорится, что у меня утечка памяти;

Detected memory leaks!
Dumping objects ->
{174} normal block at 0x00A56630, 32 bytes long.
 Data: <../media/img/bac> 2E 2E 2F 6D 65 64 69 61 2F 69 6D 67 2F 62 61 63 
{173} normal block at 0x00A565A0, 8 bytes long.
 Data: < c      > A8 63 A5 00 00 00 00 00 
Object dump complete.

_CrtDumpMemoryLeaks () имеет проблемы с boost :: ptr_vector или я что-то не так сделал? Отладчик сообщает мне, что State вызывает его деструктор (который имеет; delete sceneGraph), и я также убедился, что деструктор SceneGraph также вызывается.

Любая помощь очень ценится, я хотел бы увидеть пустой отчет об утечке памяти: -)

Ответы [ 2 ]

2 голосов
/ 14 июля 2010

Это точно не похоже на вектор, который вы пропускаете. Обратите внимание, что строка читаема, это как минимум одна подсказка.

Если вы можете получить стабильное число между фигурными скобками ("{173}"), то вы можете получить точку останова при выделении памяти. Поместите это в свою функцию main ():

_crtBreakAlloc = 173;

Используйте #include <crtdbg.h> при необходимости. Повторите для 174, чтобы найти другой.

0 голосов
/ 27 января 2015

Ну, ваш код, вероятно, на 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

...