我正在閱讀如何查找與Win32應用程序上的C++ new
運算符和標準CRT malloc
函數的內存泄漏。調試Win32 API應用程序內存泄漏
我添加了一些與Windows套接字一起工作的東西,我想包括crtdbg.h
只有在調試模式下運行,以及其他一些定義。所以我結束了一起拼湊到這一點我stdafx.cpp
作爲我的標準的預編譯的頭:
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>
// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
// Windows Sockets
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
// If running in debug mode we need to use this library to check for memory leaks, output will be in DEBGUG -> WINDOWS -> OUTPUT
// http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx
#ifdef _DEBUG
//http://stackoverflow.com/questions/8718758/using-crtdumpmemoryleaks-to-display-data-to-console
#ifndef DBG_NEW
#define DBG_NEW new (_NORMAL_BLOCK , __FILE__ , __LINE__)
#define new DBG_NEW
#endif
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#endif // _DEBUG
我也打算把這些線只是我計劃的退出點之前:
#ifdef _DEBUG
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG);
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG);
_CrtDumpMemoryLeaks();
#endif
不管怎麼說,它似乎編譯,但我得到一些奇怪的警告:
警告C4005: '_malloca':宏的重新定義
從crtdbg.h
。這是由於stdafx.h
中標題的順序錯誤造成的,或者這是正常的嗎?另外,我在正確的軌道上檢測Win32應用程序中的內存泄漏,還是在Visual Studio中應該使用其他內容?
也許你應該在包含第一個頭文件之前(或者至少在Windows.h之前)定義'_CRTDBG_MAP_ALLOC'。 – Medinoc
您可能感興趣的[VLD](http://vld.codeplex.com/)(視覺檢漏儀) –