Запутанный вывод Valgrind: косвенно потерянные блоки, но без ошибок?

Я запускаю valgrind 3.5.0, чтобы попытаться устранить утечки памяти в моей программе. Я вызываю его так:

valgrind --tool=memcheck --leak-check=yes --show-reachable=yes

После завершения моей программы valgrind сообщает, что

==22926==
==22926== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 17 from 1)
==22926== malloc/free: in use at exit: 20,862 bytes in 425 blocks.
==22926== malloc/free: 25,361 allocs, 24,936 frees, 772,998 bytes allocated.
==22926== For counts of detected errors, rerun with: -v
==22926== searching for pointers to 425 not-freed blocks.
==22926== checked 91,884 bytes.

Несмотря на то, что мне сказали, что ошибок 0, я обеспокоен тем, что количество выделений и освобождений не совпадает. Еще более тревожным является следующее:

==22926== LEAK SUMMARY:
==22926==    definitely lost: 68 bytes in 1 blocks.
==22926==    indirectly lost: 20,794 bytes in 424 blocks.
==22926==      possibly lost: 0 bytes in 0 blocks.
==22926==    still reachable: 0 bytes in 0 blocks.
==22926==         suppressed: 0 bytes in 0 blocks.

Есть дополнительный вывод, относящийся к тому, что кажется утечкой:

==22926== 20,862 (68 direct, 20,794 indirect) bytes in 1 blocks are definitely lost in loss record 9 of 17
==22926==    at 0x40269EE: operator new(unsigned int) (vg_replace_malloc.c:224)
==22926==    by 0x807960B: OneTwoThree::OneTwoThree(Scenario const*) (onetwothree.cc:22)
==22926==    by 0x804DD69: main (scsolver.cpp:654)

В рассматриваемой строке в конструкторе OneTwoThree у меня есть следующее:

OneTwoThree::OneTwoThree (const Scenario* scenario) :
    Choice("123", scenario, new Solution (scenario->name(), scenario)),
    seen_(new bool [sol_->numVisits()])
{
}

позже, в деструкторе, visible_ удаляется так:

OneTwoThree::~OneTwoThree ()
{
    delete [] seen_;
}

Нет перераспределения памяти, связанной с Seen_; Я только переворачиваю bool на true/false во время выполнения моей программы.

Я не вижу здесь утечки и не понимаю, что valgrind пытается мне сказать. Я прочитал руководство по valgrind (в частности, это), но я не сильно просвещаюсь.

Может ли кто-нибудь помочь мне найти этот вывод?


person Daniel    schedule 04.11.2009    source источник
comment
Возможно ли, что объект Solution сам никогда не уничтожается?   -  person Artelius    schedule 04.11.2009
comment
Отменяет ли класс Choice выделение указателя, который он получает в конструкторе? Похоже, что лучшим дизайном было бы владение указателем в том же классе - если OneTwoThree выделяет память, тот же экземпляр должен ее отменить.   -  person Nikolai Fetissov    schedule 04.11.2009
comment
Конструктор Choice и его родственники выпускают все полностью?   -  person Jonathan Leffler    schedule 04.11.2009


Ответы (1)


Комментаторы OP были на высоте; Создаваемый в конструкторе объект Solution никогда не удалялся. Я исправил вопиющую оплошность и избавился от уродливого кода, создающего новые объекты вне конструктора объекта, который за них отвечает.

Спасибо Артелиус, Николай и Джонатан!

person Daniel    schedule 04.11.2009
comment
Кроме того, при удержании ресурсов в операторе присваивания могут возникать утечки памяти. Следуйте закону Большой тройки: всякий раз, когда вы пишете один из конструкторов копирования, операторов присваивания или деструкторов; напишите еще два. Лично я считаю, что оператор присваивания лучше всего писать с помощью идиомы копирования и подкачки. - person Matthieu M.; 04.11.2009