DEBUG_NEW 与GDI+ 有冲突

//#ifdef _DEBUG
////#define new DEBUG_NEW //这里与GDI+ 有冲突
//#undef THIS_FILE
//static char THIS_FILE[] = __FILE__;
//#endif
展开阅读全文

debug_new讨论

03-29

昨天在饼子 面食堂 里面被问及debug_new和内存管理的一些问题,没有正面回答,当时只顾和 草草扯淡了。rn确实,平时只管用debug_new,也大概知道实现的原理,重载new,rn察看mfc的“源代码”:rnvoid* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine);rn#define DEBUG_NEW new(THIS_FILE, __LINE__)rn#if _MSC_VER >= 1200rnvoid AFX_CDECL operator delete(void* p, LPCSTR lpszFileName, int nLine);rn#endifrnrn这里先重载了new操作符,然后用debug_new的宏定义节省了this_file和line的输入。rn其中this_file是定义的一个宏得到当前文件的路径,line定义的是有new分配的那一行号。rnrn下面具体分析一下debug_new的重载:rn我们可以想一下,既然已经得到文件路径,和行号,还有分配内存时候可以得到指向内存的指针rn这些信息都是我们要得到的rn首先,我们可以先定义一个struct来存放这些信息,在分配内存的时候把这些信息放入一个map中rndelete的时候删除信息,delete时候如果map里面的信息信息已经不存在,出现了问题, 程序退出的时候如果map中还有未释放的信息,则说明还有未释放的信息,有泄漏rnrn实现的原理就是这样rnrn但是要有时要考虑多线程的问题,跨平台的问题~~==rnrnrn几个小技巧rn1。windows自带了很多内存管理的apirn_CrtDbgReport, _CrtDoForAllClientObjects, _CrtDumpMemoryLeaks,_CrtIsValidHeapPointer, _CrtIsMemoryBlock, _CrtIsValidPointer,_CrtMemCheckpoint, _CrtMemDifference, _CrtMemDumpAllObjectsSince, _CrtMemDumpStatistics, _CrtSetAllocHook, _CrtSetBreakAlloc, _CrtSetDbgFlag,_CrtSetDumpClient, _CrtSetReportFile, _CrtSetReportHook, _CrtSetReportModernrn2。mfc中封装了这些api并重载了new和deletern会在afx.h中就可以看到这些包装的咚咚rnrnrn在Windows平台下几个工具rnMS C-Runtime Library内建的检测功能;rn外挂式的检测工具,诸如,Purify,BoundsChecker等;rn利用Windows NT自带的Performance Monitor。rnrnrn无奈 电话会议中~~~“草草”几笔,不详细的地方请CSDN的星星高人添加~~rnrnps:硬着头皮写点咚咚,不需笑 啊~~ 论坛

没有更多推荐了,返回首页