📄 readme.txt
字号:
内 存 防 护 系 统 说 明
YZ yzfree@yeah.net
版权所有 (C) 2001 VCHelp coPathway ISee workgroup.
1、引言
------------------------------------------------------------------------
对于一个经常使用C++或C语言的程序员来说,最令人头疼的一个问题就是那些
莫名其妙的内存泄漏,以及内存访问异常。作为一个职业程序员是决不应该允
许这样的程序被发布出去的,我们需要尽早的将问题解决掉。但如果我们只使
用编译器自带的调试软件查找问题的话,可能需要花费很多的时间和精力(而
且这也是一件非常枯燥的工作,没有人愿意干),工作效率是很低下的。
为了解决这个问题,已有不少厂商推出了自己的内存检测软件,这些软件可以
让我们快速的找到引发问题的代码。不过这里有个问题,就是一般这类的软件
要价都比较狠,个人或者是小公司是承担不起的。
为此,我编写了这个内存防护系统。它可以有效的防止内存泄漏的发生,并且
可以帮助程序员时刻检查内存的当前状况,而且它还会适时的通知程序员引发
问题的原因(精确到具体的代码行)。虽然这个系统现在还无法与同类型的商
业软件相比,但对于个人、小公司、或是对内存检测有特殊要求的人来说还是
会非常有用的。
我开发这套系统的目的是想将它应用于ISee组的图象读写模块,以期尽早的排
除各种潜在的内存操作错误。这套系统现在还处于雏形阶段,所以我希望如果
哪位朋友有什么好的建议,请与我联系,这也是我发布这个系统的初衷。我的
联系地址是:
yzfree@yeah.net
当然,如果你有什么问题也可以向我发信询问。
2、防护系统原理
------------------------------------------------------------------------
一般情况下,编译软件对用户申请的内存块并不提供过多的保护,请看下面的
例子:
void foo()
{
char *p = (char*)malloc(32);
}
函数foo()被调用之后,它里面申请的内存块随之“漂浮”了。程序结束之后,
编译器的调试信息窗口只会告诉你有一个内存泄漏发生,并打出它的首地址。
这些信息不是很直观,实用价值也不大,因为我们需要手工去查找这块内存是
由谁分配的,如果你的程序比较大的话,这简直就是一种折磨:)
我们再来看看下面这段程序会造成什么后果:
char *p = (char*)malloc(32);
memset(p, 0, 100);
哦!你猜对了,它会让你的软件崩溃。而且每次崩溃的时间和地点都可能不同
(因为每次运行软件时,内存 p 后面的内容都可能不同)。这时编译器的调试
窗口中不会给出任何有价值的提示信息。
如果此时我们不采用任何辅助系统的话,那么我们对这一类潜在的危险将束手
无策,我们只能被动的等待错误发生。
为了解决上面的问题,防护系统采用了对每个内存块进行跟踪和记日志的方法
,也就是说用户在申请一块内存的同时,防护系统会再申请一块内存用于记录
和跟踪用户内存(称为内存信息块)的运行状态。当程序结束时,如果用户忘
了释放某块内存,那么防护系统将根据对应的内存信息块通知用户有某块内存
没有被释放,并打出分配这块内存的代码行号。这样我们就可以迅速的找到引
发泄漏的原因。
另外,防护系统在申请用户内存时,会增大这块内存的尺寸,并在内存的首尾
添加防溢出标志,如果用户在写某块内存时越界的话,那么防护系统将准确的
报告出是哪一块内存被写越界了。
最后,防护系统还具备检查程序中那些引用已释放内存的BUG,防护系统在申请
和释放用户内存时都会向内存中填充一些“废料”信息,这些信息对于程序来
说通常都是没有任何意义的,如果程序引用这些已释放内存中的数据,那么程
序员可以立即发觉这个错误。
这就是防护系统现在所具有的功能,我相信这个系统的功能还是可以扩充的。
3、应用方法
------------------------------------------------------------------------
* 将isemem.h、isemem.cpp拷入你的项目目录
* 将这两个文件加入你的项目
* 将isemem.h加入到你的StdAfx.h中
* 在InitInstance()函数首部加入ise_open_mem_sys()函数
* 在ExitInstance()函数首部加入ise_close_mem_sys()函数
* 用防护系统接口函数 ise_malloc() 取代所有的内存分配函数
* 用防护系统接口函数 ise_realloc() 取代所有的内存重分配函数
* 用防护系统接口函数 ise_free() 取代所有的内存释放函数
* 在内存操作集中的区域适时的使用 ise_check_mem_sys()、ise_help_me_sure()、
ise_check_pointer()、和ise_put_pointer_info() 函数(见源码中的注释)
4、发布版注释
------------------------------------------------------------------------
防护系统的所有代码都只在程序的调试版中有效,如果以发布版编译使用了防
护系统的软件,所有的防护系统函数都会自动消失。所以这个系统在发布状态
下不会对宿主程序的性能有任何影响。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -