2016-12-07 3 views
0

Посмотрите на это простейшее приложении:Утечка памяти в 0 строках кода.

#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 

void main(void) 
{ 
    _CrtDumpMemoryLeaks(); 
} 

Он производит следующий вывод в отладочных панелях:

Detected memory leaks! 
Dumping objects -> 
{94} normal block at 0x012EA298, 8 bytes long. 
Data: <Dw  > 44 77 D9 00 00 00 00 00 
{93} normal block at 0x012F0DA8, 20 bytes long. 
Data: </// > A8 0D 2F 01 A8 0D 2F 01 A8 0D 2F 01 01 01 CD CD 
Object dump complete. 

Detected memory leaks! как это возможно?
Win10, VS2015, целевая версия платформы 10.0.14393.0

+2

Скорее всего некоторые статически контекстными объекты, которые являются внутренними для библиотеки времени выполнения C и построены, когда C библиотека инициализирует. На самом деле это не утечка памяти. –

+0

Вероятно, ложные срабатывания от объекта, созданного временем выполнения, не уничтожаются к тому времени, когда он проверяет утечки. – NathanOliver

+0

Зачем вам все это? Вы собираетесь выйти из приложения. У вас нет такой вещи, как утечка памяти, как только ваш процесс будет существовать, если только сама ОС не глючит. Когда процесс завершается, вся выделенная память освобождается автоматически. В вашем коде ничего не изменится. –

ответ

0

I "фиксированная" это со следующими манипуляциями:

  1. Пусть stdlib проверку и показывают утечки памяти самого по себе перед выходом
     
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
    
  2. Чтобы увидеть сообщение I положило точку останова в exit.cpp:129 на
     
    ExitProcess(return_code); 
    

В результате код:

#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 

void main(void) 
{ 
    // Show memory leaks before exit 
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
    auto a = new int[33333]; 
    //_CrtDumpMemoryLeaks(); // DO NOT USE 
} 

Теперь я могу видеть только МОИХ утечек памяти в отладочной панели!

Detected memory leaks! 
Dumping objects -> 
{95} normal block at 0x014B4F48, 133332 bytes long. 
Data: <    > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete. 

33333 * 4 = 133332.

Благодаря @JamesBean и MSDN article "Finding Memory Leaks Using the CRT Library"

Смежные вопросы