常见的内存错误和对策

编程时遇到内存错误是一件很麻烦的事。因为编译器不能自动发现这些错误,通常是在程序运行时才能捕捉到,而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。


常见的内存错误及其对策如下所示:


(1)内存分配并未成功,但还是使用了它。初学者经常犯这个错误,因为并没有意识到内存分配也有可能不成功。

         常用的解决办法是,在使用内存之前检查是否为NULL,如果指针p是函数的参数,那么在函数的用口处用“assert(p!=NULL)”进行检查;

          如果用nalloc或者new申请内存,应用“if(p == NULL)”来进行防错处理。


(2)内存虽然分配成功,但是尚未初始化就开始使用它。犯这种错误主要有两个原因:一是没有初始化的概念;二是误认为内存的默认处置是零,导致引用处置错误(如数组)。所以无论用何种方式创建数组,都别忘记赋初值,即使是付出之外为零也不可以怕麻烦省略。


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


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


(5)释放了内存仍然继续在使用它,有以下三种情况:

1.程序中的对象调用关系过于复杂,实在很难搞清楚某个对象是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象的管理混乱问题。

2.函数的return语句写错了,注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时就会被销毁。

3.使用free或delete释放内存结束了以后,没有将指针置为NULL,导致产生野指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值