Утечка памяти в C ++ с boost :: ptr_vector - PullRequest
0 голосов
/ 25 сентября 2011

Я работал в проекте, но недавно я проверял, есть ли утечка в моей программе, и в результате она протекает и много.

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

В выходных данных отладки отображаются следующие строки:

Dumping objects ->
{673} normal block at 0x00E075E0, 8 bytes long.
 Data: <H   @e  > 48 92 E0 00 40 65 E0 00 
{671} normal block at 0x00E065C0, 8 bytes long.
 Data: <@e      > 40 65 E0 00 00 00 00 00 
{669} normal block at 0x00E06540, 68 bytes long.
 Data: < e  mountains.pn> C0 65 E0 00 6D 6F 75 6E 74 61 69 6E 73 2E 70 6E 
{665} normal block at 0x00E063B0, 8 bytes long.
 Data: <H       > 48 92 E0 00 00 00 00 00 
{663} normal block at 0x00E09248, 68 bytes long.
 Data: < c  nubes.png   > B0 63 E0 00 6E 75 62 65 73 2E 70 6E 67 00 CD CD 

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

tutorialLevel->addLayerToList("nubes.png", 1600.f, 720.f, 1.0f, 0.0f, 0.1f, true);
tutorialLevel->addLayerToList("mountains.png", 1600.f, 720.f, speedXVectorPanda.at(0), 0.0f, 0.5f, false);

А фактическая функция addLayerToList следующая:

void Level::addLayerToList(std::string name, GLfloat widthLayer, GLfloat heightLayer, GLfloat velX, GLfloat velY, 
                GLfloat constantX, bool hasRepetition)
{
    layersList.push_back( new Layer(name, widthLayer, heightLayer, velX, velY, constantX, hasRepetition) );
}

И LayersList определяется следующим образом:

boost::ptr_vector< Layer > layersList;

Возможно, я неправильно понял, как владение указателями работает в Boost, но в примерах, которые я недавно проверял, это правильноспособ передать право собственности на объект ptr_vector, я не прав?

И другой мой вопрос, если необходимо освободить указатели для вектора, или лучше оставить auto_ptr делать свою работу?

Тспасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 25 сентября 2011

В зависимости от того, где вы его разместили, но почти во всех случаях _CrtDumpMemoryLeaks будет , а не покажет вам правду при использовании интеллектуальных указателей STL / BOOST. Он увидит использование new в STL для утечки памяти.

0 голосов
/ 25 сентября 2011

Извините, я выяснил, в чем была проблема, и это действительно глупо, на самом деле другого слова для этого не существует.

Я забыл, что класс, который обрабатывает динамически Level, он не был выделен с новым, поэтому, пока основная функция не закончила, он не очистил все данные, поэтому я решил создать метод для очистки класса до выхода области видимости, таким образом, все указатели, которые мы правильно освободили.

Спасибо всем за помощь.

...