首页 > 代码库 > 内存相关问题

内存相关问题

常见的内存错误以及解决方案

  • 内存分配未成功,却使用了它: 常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。

  • 内存分配虽然成功,但是尚未初始化就引用它: 内存的缺省初值究竟是什么并没有统一的标准,尽管有些时候为零值,我们宁可信其无不可信其有

  • 内存分配成功并且已经初始化,但操作越过了内存的边界: 例如在使用数组时经常发生下标“多1”或者“少1”的操作。特别是在for循环语句中,循环次数很容易搞错,导致数组操作越界

  • 忘记了释放内存,造成内存泄露: 含有这种错误的函数每被调用一次就丢失一块内存。刚开始时系统的内存充足,你看不到错误。终有一次程序突然死掉,系统出现提示:内存耗尽。动态内存的申请与释放必须配对,程序中malloc与free的使用次数一定要相同,否则肯定有错误(new/delete同理)

  • 释放了内存却继续使用它。


杜绝野指针

“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。

野指针的成因:

  • 指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气

  • 指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针

  • 指针操作超越了变量的作用域范围。
    技术分享?

内存耗尽的解决方案

如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告内存申请失败。??三种解决方案

  • 判断指针是否为NULL,如果是则马上用return语句终止本函数
    技术分享?

  • 判断指针是否为NULL,如果是则马上用exit(1)终止整个程序的运行
    技术分享?

  • 为new和malloc设置异常处理函数。 例如Visual C++可以用_set_new_hander函数为new设置用户自己定义的异常处理函数,也可以让malloc享用与new相同的异常处理函数。

很多人不忍心用exit(1),问:“不编写出错处理程序,让操作系统自己解决行不行?”不行。如果发生“内存耗尽”这样的事情,一般说来应用程序已经无药可救。如果不用exit(1) 把坏程序杀死,它可能会害死操作系统。道理如同:如果不把歹徒击毙,歹徒在老死之前会犯下更多的罪。


C++中的健壮指针和资源管理

内存相关问题