Ошибка файла обнаружения утечки памяти

У меня есть программа, которая должна выводить информацию об утечках памяти. Тем не менее, это не работает. Ниже приводится программа:

#include <crtdbg.h>
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
FILE *out_file;
int *a = new int;

//Redirect the error stream to a file.
freopen_s (&out_file, "Memory Leaks.txt", "w", stderr);

//Turn on debugging for memory leaks. This is automatically turned off when the build is Release.
_CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
_CrtSetReportMode (_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile (_CRT_WARN, _CRTDBG_FILE_STDERR);
_CrtSetReportMode (_CRT_ERROR, _CRTDBG_MODE_FILE);
_CrtSetReportFile (_CRT_ERROR, _CRTDBG_FILE_STDERR);
_CrtSetReportMode (_CRT_ASSERT, _CRTDBG_MODE_FILE);
_CrtSetReportFile (_CRT_ASSERT, _CRTDBG_FILE_STDERR);

return 0;
}

Я строю в версии DEBUG, поэтому функции не должны игнорироваться. Я использую компилятор Visual Studio 2010. Программа создает только файл «Memory Leaks.txt», но в нем нет содержимого. Какие-нибудь мысли?

—РЕДАКТИРОВАТЬ—

Я обновил программу, чтобы использовать «правильный дескриптор файла», как предложено. Программа по-прежнему ничего не выводит в файл.

—РЕДАКТИРОВАТЬ—

Проблема была с закрытием файла. Следующий код теперь работает.

#include <crtdbg.h>
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HANDLE hLogFile;
int *a;

//Open a file for output.
hLogFile = CreateFile ("Memory Leaks.txt", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

//Turn on debugging for memory leaks. This is automatically turned off when the build is Release.
_CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
_CrtSetReportMode (_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile (_CRT_WARN, hLogFile);
_CrtSetReportMode (_CRT_ERROR, _CRTDBG_MODE_FILE);
_CrtSetReportFile (_CRT_ERROR, hLogFile);
_CrtSetReportMode (_CRT_ASSERT, _CRTDBG_MODE_FILE);
_CrtSetReportFile (_CRT_ASSERT, hLogFile);

//Create a memory leak.
a = new int;

//Don't close this file. Closing the file will cause the report not to be outputted.
//CloseHandle(hLogFile);

return 0;
}

3

Решение

Прекратите связывать, чтобы перенаправить stderr или же стандартный вывод в приложении Windows с графическим интерфейсом и откройте соответствующий дескриптор файла. это однострочник.

HANDLE hLogFile = CreateFile(L"Memory Leaks.txt", GENERIC_WRITE, FILE_SHARE_WRITE,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

//Turn on debugging for memory leaks. This is automatically turned off when the build is Release.
_CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
_CrtSetReportMode (_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile (_CRT_WARN, hLogFile);
_CrtSetReportMode (_CRT_ERROR, _CRTDBG_MODE_FILE);
_CrtSetReportFile (_CRT_ERROR, hLogFile);
_CrtSetReportMode (_CRT_ASSERT, _CRTDBG_MODE_FILE);
_CrtSetReportFile (_CRT_ASSERT, hLogFile);

И не закрывайте РУЧКУ до того, как отчеты будут сгенерированы!

5

Другие решения

Должен использоваться для вывода потока STDERR.

//Redirect the error stream to a file.
freopen_s (&out_file, "Memory Leaks.txt", "w", stderr);

Пример можно найти:
http://msdn.microsoft.com/en-us/library/a68f826y%28v=VS.71%29.aspx

0

попробуйте это вместо

#include < crtdbg.h >
#define _CRTDBG_MAP_ALLOC
0
По вопросам рекламы [email protected]