内存检测 用的。。

  1. #endif
  2. #define _CRTDBG_MAP_ALLOC
  3. #include <crtdbg.h>
  4. #ifdef _DEBUG
  5. #define new DEBUG_CLIENTBLOCK
  6. #endif
  7. class Test
  8. {
  9. public:
  10.     Test()      {   _p = new int();     }
  11.     ~Test()     {   delete _p;          }
  12.     int* _p;
  13. };
  14. int _tmain(int argc, _TCHAR* argv[])
  15. {
  16.     _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
  17.     int* p = new int();
  18.     delete p;
  19.     Test t;
  20.     return 0;
  21. }

 

  _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
该语句在程序退出时自动调用 _CrtDumpMemoryLeaks。必须同时设置 _CRTDBG_ALLOC_MEM_DF 和 _CRTDBG_LEAK_CHECK_DF.
  这样,该版本已经达到了MFC一样的效果了,但是我觉得光这样还不够,因为我们只是在Output窗口中输出信息,对开发人员的提醒还不明显,经常会被遗漏,而且很多人就算发现了内存泄露,但是不好修复,不会严重影响到程序外在表现,都不会修复。怎么样能让开发人员主动的修复内存泄露的问题呢?记得曾经和人配合写程序,我的函数参数有要求,不能为空,但是别人老是传空值,没办法了,只好在函数开始验证函数参数,给他assert住,这样程序运行时老是不停的弹出assert,调试程序那个烦压,最后其他程序员烦了,就把这个问题给改好了,输入参数就正确了。所以我觉得咱要让程序员主动去做一件事,首先要让他觉得做这个事是能减轻自己负担,让自己工作轻松的。呵呵,那咱们也这样,当程序退出时,检测到内存泄露就让程序提示出来。
  看检测内存泄露版本四

  1. #include "stdafx.h"
  2. #include <assert.h>
  3. #ifdef _DEBUG
  4. #define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)
  5. #else
  6. #define DEBUG_CLIENTBLOCK
  7. #endif
  8. #define _CRTDBG_MAP_ALLOC
  9. #include <crtdbg.h>
  10. #ifdef _DEBUG
  11. #define new DEBUG_CLIENTBLOCK
  12. #endif
  13. void Exit()
  14. {
  15.     int i = _CrtDumpMemoryLeaks();
  16.     assert( i == 0);
  17. }
  18. int _tmain(int argc, _TCHAR* argv[])
  19. {
  20.     atexit(Exit);
  21.     int* p = new int();
  22.     return 0;
  23. }

  该版本会在程序退出时检查内存泄露,假如存在就会弹出提示对话框.
 atexit(Exit);设置了在程序退出时执行Exit()函数。
 Exit()函数中,假如存在内存泄露,_CrtDumpMemoryLeaks()会返回非0值,就会被assert住了。

   到这个版本已经达到可以使用的程度了。但是我们还可以做些改进,因为真要准确的检测到代码中所有的内存泄露,需要把代码中的#define……拷贝到所有使用new的文件中。不可能每个文件都拷贝这么多代码,所以我们可以将他提取出来,放在一个文件中,比如我是放在KDetectMemoryLeak.h中,该文件内容如下:

 

 

  1. #pragma once
  2. #ifdef _DEBUG
  3. #define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)
  4. #else
  5. #define DEBUG_CLIENTBLOCK
  6. #endif
  7. #define _CRTDBG_MAP_ALLOC
  8. #include <stdlib.h>
  9. #include <crtdbg.h>
  10. #ifdef _DEBUG
  11. #define new DEBUG_CLIENTBLOCK
  12. #endif

  然后将KDetectMemoryLeak.h包含在项目的通用文件中,例如用VS建的项目就将其包含在stdafx.h中。或者我自己建的一个Common.h文件中,该文件包含一些通用的,基本所有文件都会用到的代码东东。

  好了,到现在,检测内存泄露总算完成了,而且他还能定位到到底是代码中哪个文件,哪行出现了内存泄露。下一篇文章将会讲些实际遇到的一些问题,例如只知道有内存泄露,但是不知道到底内存泄露的具体位置,如何利用内存断点等技术来定位内存泄露的位置啊,最后会从代码的角度讲下,怎么样才能避免内存泄露吧。

你可能感兴趣的:(工作,File,delete,mfc,leak,output)