⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readme.txt

📁 内存泄漏管理,介绍内存泄漏的避免方法
💻 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 + -