设为首页 加入收藏

TOP

检测C++的内存泄漏用哪些工具
2014-11-11 17:00:08 来源: 作者: 【 】 浏览:49
Tags:检测 内存 泄漏 哪些 工具

  OpenSSL采用C语言作为开发语言,这使得OpenSSL具有优秀的跨平台性能,这对于广大技术人员来说是一件非常美妙的事情,可以在不同的平台使用同样熟悉的东西。OpenSSL支持Linux、Windows、BSD、Mac、VMS等平台,这使得OpenSSL具有广泛的适用性。不过,对于目前新成长起来的C++程序员,可能对于C语言的代码不是很习惯,但习惯C语言总比使用C++重新写一个跟OpenSSL相同功能的软件包轻松不少。


  OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。


  作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。


  Openssl版本0.9.8i 地址:http://www.openssl.org/source/openssl-0.9.8i.tar.gz


  ActivePerl版本5.8.8.822 Windows/5.8/ActivePerl-5.8.8.822-MSWin32-x86-280952.msi">http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl-5.8.8.822-MSWin32-x86-280952.msi


  编译器VS2005 提供不了下载地址了 机器上一直有,不是这次特意安装的。


  安装VC6.0也行,反正貌似只要是c++编译器就差不多,但是我今天安装使用的是VS2005


  安装步骤:


  1.安装VC和ActivePerl,先后顺序无所谓,安装时注意勾选添加环境变量的选项。


  2.解压Openssl,解压后会发现openssl-0.9.8i目录下面有很多文件


  其中的一个文件是INSTALL.W32用记事本或者其他文本编辑器打开,这个文件是介绍Win32平台的安装方法,我下面的批处理也是根据这个文件写的,大家最好依据这文件的描述安装,英文不好的,可以对照我的批处理来看,如果大家安装的版本和我相同,那么直接使用下面的批处理安装即可。


  在INSTALL.W32相同目录下新建一个批处理install.bat,内容如下


  @rem --prefix 指定安装目录


  perl Configure VC-WIN32 --prefix=D:/SYJ.WORK/SYJ.ENV/openssl


  pause


  call ms\do_ms


  pause


  nmake -f ms\ntdll.mak


  pause


  nmake -f ms\ntdll.mak test


  pause


  nmake -f ms\ntdll.mak install


  pause


  注意先不要执行它,因为需要VC的环境变量,建议通过开始菜单-程序-Microsoft Visual Studio 2005-Visual Studio Tools-Visual Studio 2005 命令提示-进入cmd后通过cd 进入到openssl-0.9.8i目录,然后在这个cmd下执行批处理install.bat就可以了。


  注意事项:


  1.安装时间比较长,请耐心等待


  2.每个步骤间使用了pause暂停,便于观察。每步完成后按任意键继续,注意有没有报错。


  3.可以不通过Visual Studio 2005 命令提示进入cmd,但是一定保证cmd下有vc的环境变量,可以手工调用vc目录下设置环境变量的批处理vcvars32.bat,在VC的安装目录下可以搜索到这个文件。因为不同版本的vc这个文件所在位置不同所以我就不说明它的位置了。测试是否有vc环境最简单的测试方法是在执行install.bat前先在cmd下执行下cl,没有vc环境的话会报


  'cl' 不是内部或外部命令,也不是可运行的程序


  4.提示%OSVERSION% is not defined 这个错误的时候可以忽略它没关系


  5.网上搜索到安装前修改OpenSSL目录下的MS目录下的ntdll.mak文件,将CFLAG的/WX选项去掉,


  否则cl编译器会报.\crypto\des\enc_read.c文件的read是The POSIX name for this item is deprecated 建议使用_read。


  因为我使用非常简单的功能所以我没有修改它,需要的朋友可以尝试修改它。


  6.最终编译结束会在指定安装目录下产生3个子目录分别是bin,include,lib


  本文浅谈一下C++内存泄漏的检测,首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复。


  最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck工具,功能非常强大,相信做C++开发的人都离不开它。此外就是不使用任何工具,而是自己来实现对内存泄露的监控,分如下两种情况:


  一. 在 MFC 中检测内存泄漏


  假如是用MFC的程序的话,很简单。默认的就有内存泄露检测的功能。


  我们用VS2005生成了一个MFC的对话框的程序,发现他可以自动的检测内存泄露.不用我们做任何特殊的操作. 仔细观察,发现在每个CPP文件中,都有下面的代码:


  #ifdef _DEBUG


  #define new DEBUG_NEW


  #endif


  DEBUG_NEW 这个宏定义在afx.h文件中,就是它帮助我们定位内存泄漏。


  在含有以上代码的cpp文件中分配内存后假如没有删除,那么停止程序的时候,VisualStudio的Output窗口就会显示如下的信息了:


  Detected memory leaks!


  Dumping objects ->


  d:\code\mfctest\mfctest.cpp(80) : {157} normal block at 0x003AF170, 4 bytes long.


  Data: < > 00 00 00 00


  Object dump complete.


  在Output窗口双击粗体字那一行,那么IDE就会打开该文件,定位到该行,很容易看出是哪出现了内存泄露。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C选美比赛 下一篇简单有趣的算法:魔方阵

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: