использование _CrtDumpMemoryLeaks для отображения данных на консоли - PullRequest
3 голосов
/ 04 января 2012

Я использую функцию _CrtDumpMemoryLeaks, которая прекрасно работает но в документации обещали не только вернуть true или false, но и распечатать некоторую информацию.

Я пытался использовать:

_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );

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

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

int main() {
slist* students = 0;
clist* courses = 0;
char  c;
char  buf[100];
int   id, num;

malloc(100);
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );


printf("there is memmory leaks?: %d\n",_CrtDumpMemoryLeaks());
system("pause");

return 0;
}

на выходе нет данных об утечках памяти .. почему это?

кстати выход

есть утечка памяти ?: 1 Нажмите любую клавишу для продолжения . , .

Ответы [ 2 ]

4 голосов
/ 04 января 2012

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

// declare memory stare variable
_CrtMemState state;

...

// create a checkpoint to for current memory state
_CrtMemCheckpoint(&state);

... do stuff ...

// report differences
_CrtMemDumpAllObjectsSince(&state);

Эта процедура сбросит все выделения, начиная с контрольной точки. Он может быть обернут вокруг вызова функции, загружен при запуске и при выходе и т. Д. Я также использовал его в DLL-файле в процессе подключения / отключения DllMain.

Также удобно в сочетании с _CrtSetReportMode, _CrtSetReportFile и т. Д.

2 голосов
/ 04 января 2012

Если вы запускаете это в отладочном экземпляре Visual Studio 2010, вам нужно взглянуть на выходные данные отладки (Debug -> Windows -> Output).

Более того, вам нужноустановить режим отчета не только для ошибок, , но и для предупреждений (именно здесь будут сообщаться утечки памяти):

_CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_DEBUG );
/* Alternatively:
 * _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
 * _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDERR );
 */

, который предоставил мне следующий вывод для вашей программы:

Detected memory leaks!
Dumping objects ->
dump.c(14) : {86} normal block at 0x00834E50, 100 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
there is memmory leaks?: 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...