从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。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值