检测C++的内存泄漏用哪些工具

来源:计算机等级考试    发布时间:2012-08-28    计算机等级考试视频    评论

  class Test

  {

  public:

  Test()      {   _p = new int();     }

  ~Test()     {   delete _p;          }

  int* _p;

  };

  int _tmain(int argc, _TCHAR* argv[])

  {

  _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

  int* p = new int();

  delete p;

  Test t;

  return 0;

  }

  _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );该语句在程序退出时自动调用 _CrtDumpMemoryLeaks。必须同时设置 _CRTDBG_ALLOC_MEM_DF 和 _CRTDBG_LEAK_CHECK_DF.

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

  看检测内存泄露版本四:

  #include "stdafx.h"

  #include

  #ifdef _DEBUG

  #define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)

  #else

  #define DEBUG_CLIENTBLOCK

  #endif

  #define _CRTDBG_MAP_ALLOC

  #include

  #ifdef _DEBUG

  #define new DEBUG_CLIENTBLOCK

  #endif

  void Exit()

  {

  int i = _CrtDumpMemoryLeaks();

  assert( i == 0);

  }

  int _tmain(int argc, _TCHAR* argv[])

  {

  atexit(Exit);

  int* p = new int();

  return 0;

  }

  该版本会在程序退出时检查内存泄露,假如存在就会弹出提示对话框.

  atexit(Exit);设置了在程序退出时执行Exit()函数。Exit()函数中,假如存在内存泄露,_CrtDumpMemoryLeaks()会返回非0值,就会被assert住了。

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

  #pragma once

  #ifdef _DEBUG

  #define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)

  #else

  #define DEBUG_CLIENTBLOCK

  #endif

  #define _CRTDBG_MAP_ALLOC

  #include

  #include

  #ifdef _DEBUG

  #define new DEBUG_CLIENTBLOCK

  #endif

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

  编辑特别推荐:

  WINAPI编程获取文件版本信息的代码

上一页345下一页

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答