首页 > 代码库 > 内存相关问题
内存相关问题
常见的内存错误以及解决方案
内存分配未成功,却使用了它: 常用解决办法是,在使用内存之前检查指针是否为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++中的健壮指针和资源管理
内存相关问题