文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | 免费看大片 | WPS | 杀毒软件
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形处理 办公软件 媒体动画 精文荟萃 工具软件 网络编程 程序开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院程序开发IT人生如何检测内存泄漏——重载new和delete
精品推荐
特别推荐
·值得回忆的本科四年学习(1-6)
·如何检测内存泄漏——重载new和delete
·Linux IPC小结
·编程初学者的良言警句
·如何用正确的方法写出高质量软件的75条体会
·一个程序员的经典自白
·程序员十大安全技巧
热点TOP10
·网管工作总结--我的网管生活经历
·李纳斯·托沃兹(Linus Torvalds):Linux之父
·华硕员工长篇记实:天堂向左,华硕往右
·将CStdioFile类扩展,读取UNICODE文本文件
·VC++学习方法及书籍推荐
·SP 短信开发-PROVISION接口实现-正向订购实例代码
·从ACM会议看中国大陆计算机科学与国外的差距-- 灵芯
·如何检测内存泄漏——重载new和delete
·七年之后我逃离编程
·用DirectDraw编写动画程序
·dotproject 安装总结
·老程序员十年生涯黯然总结
·回调设计模式
·IT人的酸甜苦辣 女测试工程师的成长
·Linux IPC小结
·一位30岁软件工程硕士的困惑
·值得回忆的本科四年学习(1-6)
·老程序员十年生涯黯然总结(四)
·SP 短信开发-PROVISION接口实现-反向取消实例代码
·世界五大顶级合法黑客和他们的创新故事

如何检测内存泄漏——重载new和delete

日期:2007年5月11日 作者: 查看:[大字体 中字体 小字体]


版权申明
本文可以被自由转载,但是必须遵循如下版权约定:
1、保留本约定,并保留在文章的开头部分。
2、不能任意修改文章内容,或者删节,增加。如果认为本文内容有不当之处需要修改,请
与作者联系。
3、不能摘抄本文的内容,必须全文发表或者引用。
4、必须保留作者署名、注明文章出处。(本文授权给www.linuxaid.com.cn)
5、如不遵守本规定,则无权转载本文。 
作者
ariesram
电子邮件地址
ariesram@linuxaid.com.cn, 或 ariesram@may10.ca
本文及本人所有文章均收集在bambi.may10.ca/~ariesram/articles/中。
本文授权给www.linuxaid.com.cn。

正文:
我曾经参与过一个比较大的项目,在这个项目里面,我们没有一个完全确定的设计文档,所以程序的实现常常变动。虽然我们有一个比较灵活的框架,但是从程序的角度来讲,它使我们的程序非常的混乱。直到发布的日期临近,我们还没有一个稳定的可以用来做alpha测试的版本。所以我们必须尽快的删除掉无用的代码,让这个版本足够的稳定。但是,在这个没有足够规范的软件公司,我们没有时间也没有足够的精力来做边界测试之类的工作。所以我们只能采用变通的办法。在软件中最大的问题就是内存泄漏。因为往往出现这样的情况,我们在一段代码中分配了内存,但是却没有释放它。这造成了很大的问题。我们需要一个简单的解决方案,能够简单的编译进这个项目,在运行的时候,它能够产生一个没有被释放的内存的列表,用这个列表,我们能够改正程序的错误。这就是我们称之为内存跟踪的方法。首先,我们需要一种代码,能够被加入到源代码中去,而且这种代码能够被重用。代码重用是一种很重要的特性,能够节省大量的时间和金钱以及程序员的劳动。另外,我们的这种代码必须简单,因为我们当时已经没有那么多的时间和精力去完全重看一遍所有的代码来重新编写以及改正错误从而使内存跟踪能够起作用。

好在,我们总能够找到解决的办法。首先,我们检查了代码,发现所有的代码都是用new来分配内存,用delete来释放内存。那么,我们能够用一个全程替换,来替换掉所有的new和delete操作符吗?不能。因为代码的规模太大了,那样做除了浪费时间没有别的任何好处。好在我们的源代码是用C++来写成的,所以,这意味着没有必要替换掉所有的new和delete,而只用重载这两个操作符。对了,值用重载这两个操作符,我们就能在分配和释放内存之前做点什么。这是一个绝对的好消息。我们也知道该如何去做。因为,MFC也是这么做的。我们需要做的是:跟踪所有的内存分配和交互引用以及内存释放。我们的源代码使用Visual C++写成,当然这种解决方法也可以很轻松的使用在别的C++代码里面。要做的第一件事情是重载new和delete操作符,它们将会在所有的代码中被使用到。我们在stdafx.h中,加入:
#ifdef _DEBUG
inline void * __cdecl operator new(unsigned int size, 
const char *file, int line)
{
};

inline void __cdecl operator delete(void *p)
{
};
#endif
这样,我们就重载了new和delete操作符。我们用$ifdef和#endif来包住这两个重载操作符,这样,这两个操作符就不会在发布版本中出现。看一看这段代码,会发现,new操作符有三个参数,它们是,分配的内存大小,出现的文件名,和行号。这对于寻找内存泄漏是必需的和重要的。否则,就会需要很多时间去寻找它们出现的确切地方。加入了这段代码,我们的调用new()的代码仍然是指向只接受一个参数的new操作符,而不是这个接受三个参数的操作符。另外,我们也不想记录所有的new操作符的语句去包含__FILE__和__LINE__参数。我们需要做的是自动的让所有的接受一个参数的new操作符调用接受三个参数的new操作符。这一点可以用一点点小的技巧去做,例如下面的这一段宏定义,
#ifdef _DEBUG
#define DEBUG_NEW new(__FILE__, __LINE__)
#else
#define DEBUG_NEW new
#endif
#define new DEBUG_NEW
现在我们所有的接受一个参数的new操作符都成为了接受三个参数的new操作符号,__FILE__和__LINE__被预编译器自动的插入到其中了。然后,就是作实际的跟踪了。我们需要加入一些例程到我们的重载的函数中去,让它们能够完成分配内存和释放内存的工作。这样来做, #ifdef _DEBUG
inline void * __cdecl operator new(unsigned int size,
const char *file, int line)
{
void *ptr = (void *)malloc(size);
AddTrack((DWORD)ptr, size, file, line);

[1] [2] 下一页 




上一篇:PU1入库单

下一篇:PHP的一个完整SMTP类(解决当mail()遇上邮件服务器需要验证时的问题)

如何检测内存泄漏——重载new和delete 相关文章:
·教你学习如何破解XP登陆密码
·教你如何复制别人的QQ空间
·“黑客”教你如何远程控制计算机
·将系统装到U盘中 如何自制XP@USB启动盘
·如何显示输入法图标(输入法图标消失)
·如何建立一个网站?规划、设计、目的、原则、宣传
·如何在QQ空间加入播放器代码
·如何查出QQ好友精确地理位置
·教你如何制作QQ空间FLASH导航条
·如何实现局域网打印机共享
如何检测内存泄漏——重载new和delete 相关软件:
·如何安装双系统
·死亡之屋3 内存修改器
·三国志10威力加强PK版中文版 内存+存档+剧本修改器v1.10
·如何加固Windows XP 主机安全
·如何评估您的商机
·如何开公司
·零起点教你如何破解软件和制作注册机 and 视频+程序
·剑侠情缘外传月影传说中文版 完美内存修改器v2.0A版
·剑侠情缘外传月影传说中文版v1.01升级版 完美内存修改器v2.5A版
·如何安装XP系统

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.viphot.com
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.viphot.com All Rights Reserved. 鄂ICP备05000083号Powered by:viphot