<2011_0515> /** * @file FindWin32MemoryLeak_vs6.cpp * @brief 查找纯win32c++程序的内存泄漏 * @note 运行纯win32c++程序的时候,默认情况下,/n 如果不做处理,即使有内存泄漏,也发现不了/n 需要做的处理: 重载new和malloc/n #ifdef _DEBUG/n #define new new(_CLIENT_BLOCK, __FILE__, __LINE__)/n #define malloc(s) _malloc_dbg(s, _CLIENT_BLOCK, __FILE__, __LINE__)/n #endif/n */ #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <tchar.h> #include <CRTDBG.H> // for _CLIENT_BLOCK #ifdef _DEBUG #define new new(_CLIENT_BLOCK, __FILE__, __LINE__) #define malloc(s) _malloc_dbg(s, _CLIENT_BLOCK, __FILE__, __LINE__) #endif /** * @fn INT OverloadNewOperator() * @brief 在调试器DEBUG模式下, 重载new操作符 * @note 如果有内存泄漏, 在程序退出后, IDE可以指出内存泄漏的行号 * 双击内存泄漏的提示,可以定位到具体源码行 * 在vs2005, vs6下实验通过. * @return INT * @retval S_OK, 恒返回S_OK */ INT OverloadNewOperator(); /** * @fn INT GenerateMemoryLeak(size_t nSizeMemoryBlock) * @brief 产生 size = nSizeMemoryBlock 的内存泄漏 * @param size_t nSizeMemoryBlock, 要制造的内存泄漏大小 * @return INT * @retval S_OK, 恒返回S_OK */ INT GenerateMemoryLeak(size_t nSizeMemoryBlock); INT main(INT argc, TCHAR * argv[]) { _tprintf(_T("FindWin32MemoryLeak_vs6/n")); /** * 重载new操作符, 用于侦测内存泄漏 */ OverloadNewOperator(); /** * 制造1024Bytes的内存泄漏 */ GenerateMemoryLeak(1024); _tprintf(_T("END/n")); getchar(); return 0; /** @note 由new和malloc引起的内存泄漏都能侦测到了/n run results/n Detected memory leaks!/n Dumping objects ->/n d:/lsprj/subjectresearch/查找纯win32c++程序的内存泄漏/program/mainprog/findwin32memoryleak_vs6/findwin32memoryleak_vs6.cpp(89) : {50} client block at 0x00383D68, subtype 0, 1024 bytes long./n Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD /n d:/lsprj/subjectresearch/查找纯win32c++程序的内存泄漏/program/mainprog/findwin32memoryleak_vs6/findwin32memoryleak_vs6.cpp(88) : {49} client block at 0x00381000, subtype 0, 1024 bytes long./n Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD /n Object dump complete./n The thread 0x364 has exited with code 0 (0x0)./n */ } INT OverloadNewOperator() { /** @note /n INT iFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);/n _CrtSetDbgFlag(iFlag | _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);/n */ INT iFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); _CrtSetDbgFlag(iFlag | _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); return S_OK; } INT GenerateMemoryLeak(size_t nSizeMemoryBlock) { new TCHAR[nSizeMemoryBlock]; malloc(nSizeMemoryBlock); return S_OK; }