У меня были подобные проблемы в прошлом - утечки памяти из-за циклических ссылок shared_ptr, которые оставались незамеченными в течение нескольких месяцев.
Остерегайтесь "тайников". У меня есть объект (назовем его «Фабрика»), который обрабатывает элементы («Виджет»). У виджетов было свойство быть A) неизменным и B) иметь shared_ptr<Factory>
для своего создателя (он иногда создавал другие виджеты и т. Д.). Все работало нормально, пока я не добавил кэш Widget в Factory - поскольку виджеты были неизменяемыми, имело смысл кэшировать их, чтобы возвращать один и тот же виджет каждый раз, когда его запрашивали. Мой кеш был кешем shared_ptr<Widget>
, поэтому мгновенная тихая утечка. Исправления очевидны, поэтому я не буду вдаваться в них.
В конечном итоге я смог опереться на платформу, которую использовал для обнаружения таких утечек памяти из ЭЛТ. CRT в Visual Studio имеет обнаружение утечек памяти и отчеты, которые я включил в своей тестовой программе для предотвращения регрессий:
int main()
{
// code code code
// code code code
#ifdef _MSC_VER
_CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
_CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
_CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT );
_CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );
_CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT );
_CrtDumpMemoryLeaks();
#endif
}
GCC, вероятно, имеет аналогичные базовые сообщения об утечках, но я не знаю, что это такое.