2015-01-29 1 views
2

У меня была утечка памяти в моей большой программе, обнаруженной системой отладки Visual Studio CRT. Я сократил свою программу до следующего, все еще обнаруживая утечку памяти.Утечка памяти обнаружена в очень простой программе. Что делать?

#include "stdafx.h" 
#include "crtdbg.h" 

int main() 
{ 
    int tmp = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); 
    _CrtSetDbgFlag(tmp | _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
    int* k = new int(8); 
    delete k; 
    return 0; 
} 

Когда я запускаю его в моей системе Visual Studio 2012, я вижу следующее:

Detected memory leaks! 
Dumping objects -> 
{65} normal block at 0x00663008, 4424 bytes long. 
Data: <X #f   > 58 CF 14 00 90 23 66 00 01 00 00 00 00 00 00 00 
{64} normal block at 0x00662390, 4 bytes long. 
Data: < > 00 C3 14 00 
Object dump complete. 

Если удалить выделение и освобождение, утечки не появляются. Если я заменил распределение и освобождение любой стандартной библиотекой, использующей выделение памяти (например, std::string k), появятся утечки.

Почему возникают утечки памяти? Как я могу их удалить?


Я попытался отладки моей проблемы, установив _crtBreakAlloc 64; система остановилась в месте, которое должно мне помочь (см. таблицу следов ниже). Но я не знаю, что делать с этой информацией.

> test_it.exe!_heap_alloc_dbg_impl(unsigned int nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 393 C++ 
    test_it.exe!_nh_malloc_dbg_impl(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 239 C++ 
    test_it.exe!_nh_malloc_dbg(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine) Line 302 C++ 
    test_it.exe!malloc(unsigned int nSize) Line 56 C++ 
    test_it.exe!_PlatformSpecificMalloc() Unknown 
    test_it.exe!MemoryLeakWarningPlugin::ignoreAllLeaksInTest(void) Unknown 
    test_it.exe!operator new(unsigned int) Unknown 
    test_it.exe!MemoryLeakWarningPlugin::getGlobalDetector(void) Unknown 
    test_it.exe!std::error_condition::value(void) Unknown 
    test_it.exe!operator new(unsigned int) Unknown 
    test_it.exe!main() Line 9 C++ 

Моя система:

  • Microsoft Visual Studio Professional 2012
  • Версия 11.0.61030.00 Update 4
  • Visual C++ 2012 04938-004-0034007-02224
  • Windows 7
+0

Что произойдет, если вы просто вызываете '_CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);' без объединения их с существующими битами? – sjdowling

+0

@sjdowling Без изменений – anatolyg

+0

С какой библиотекой runtime вы ссылаетесь? Если это 'Multithread Debug DLL', измените его на' Multithread Debug' и посмотрите, существует ли проблема после восстановления и повторного запуска вашего приложения. – PaulMcKenzie

ответ

3

Ваш стек вызовов предполагает, что e - другой инструмент для утечки памяти, который используется, помимо функций выполнения Visual C++.

Использование Google берет меня по этой ссылке: https://github.com/auser/cpputest/blob/master/src/CppUTest/MemoryLeakWarningPlugin.cpp

Так, возможно, cppuTest прикладывается к вашему простому проекту без вас не подозревая об этом.

Предлагаю вам создать совершенно новое консольное приложение Win32, скопировать и вставить свой код и повторить проверку. Убедитесь, что новый проект не имеет дополнительных зависимостей.

0

Просто попробовал его с чистой установкой VS 2012 с установленным Deleaker. Никаких утечек не видно. И нет выхода из CRT в финале.

Что такое MemoryLeakWarningPlugin, упомянутое в трассировке стека? Кажется, это часть CppUTest (я немного Google).

Я думаю, что либо MemoryLeakWarningPlugin просачивается, либо как-то ломает CRT-диагностическую систему.