从debug_new浅谈内存泄漏检查

debug_new和内存管理的一些问题
确实,平时只管用debug_new,也大概知道实现的原理,重载new,
察看mfc的“源代码”:
void* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine);
#define DEBUG_NEW new(THIS_FILE, __LINE__)
#if _MSC_VER >= 1200
void AFX_CDECL operator delete(void* p, LPCSTR lpszFileName, int nLine);
#endif
这里先重载了new操作符,然后用debug_new的宏定义节省了this_file和line的输入。
其中this_file是定义的一个宏得到当前文件的路径,line定义的是有new分配的那一行号。
下面具体分析一下debug_new的重载:
我们可以想一下,既然已经得到文件路径,和行号,还有分配内存时候可以得到指向内存的指针
这些信息都是我们要得到的
首先,我们可以先定义一个struct来存放这些信息,在分配内存的时候把这些信息放入一个map中
delete的时候删除信息,delete时候如果map里面的信息信息已经不存在,出现了问题, 程序退出的时候如果map中还有未释放的信息,则说明还有未释放的信息,有泄漏
实现的原理就是这样
但是要有时要考虑多线程的问题,跨平台的问题~~==

几个小技巧
1。windows自带了很多内存管理的api
_CrtDbgReport, _CrtDoForAllClientObjects, _CrtDumpMemoryLeaks,_CrtIsValidHeapPointer, _CrtIsMemoryBlock, _CrtIsValidPointer,_CrtMemCheckpoint, _CrtMemDifference, _CrtMemDumpAllObjectsSince, _CrtMemDumpStatistics, _CrtSetAllocHook, _CrtSetBreakAlloc, _CrtSetDbgFlag,_CrtSetDumpClient, _CrtSetReportFile, _CrtSetReportHook, _CrtSetReportMode
2。mfc中封装了这些api并重载了new和delete
会在afx.h中就可以看到这些包装的咚咚

在Windows平台下几个工具
MS C-Runtime Library内建的检测功能;
外挂式的检测工具,诸如,Purify,BoundsChecker等;
利用Windows NT自带的Performance Monitor。

你可能感兴趣的:(操作系统)