<b>C++内存管理详解</b>[VC/C++编程]
本文“<b>C++内存管理详解</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
巨大的Bill Gates 曾经失言:
640K ought to be enough for everybody — Bill Gates 1981
程序员们常常编写内存管理程序,常常提心吊胆.假如不想触雷,唯一的办理办法就是发现全部暗藏的地雷并且解除它们,躲是躲不了的.本文的内容比普通教科书的要深化得多,读者需细心阅读,做到真正地通晓内存管理.
1、内存分配方法
内存分配方法有三种:
(1)从静态存储区域分配.内存在程序编译的时刻就已经分配好,这块内存在程序的整个运行期间都存在.比方全局变量,static变量.
(2)在栈上成立.在履行函数时,函数内部分变量的存储单元都可以在栈上成立,函数履行完毕时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集合,效率很高,但是分配的内存容量有限.
(3) 从堆上分配,亦称动态内存分配.程序在运行的时刻用malloc或new申请肆意多少的内存,程序员自己负责在什么时刻用free或delete释放内存.动态内存的生存期由我们决意,利用非常机动,但问题也最多.
2、常见的内存错误及其对策
发生内存错误是件非常麻烦的事情.编译器不能自动发现这些错误,普通是在程序运行时才能捕捉到.而这些错误大多没有明显的症状,时隐时现,增添了改错的难度.有时用户肝火冲冲地把你找来,程序却没有发生任何问题,你一走,错误又爆发了. 常见的内存错误及其对策以下:
* 内存分配未成功,却利用了它.
编程新手常犯这种错误,因为他们没有意识到内存分配会不成功.常用办理办法是,在利用内存之前查抄指针能否为NULL.假如指针p是函数的参数,那么在函数的进口处用assert(p!=NULL)举行
查抄.假如是用malloc或new来申请内存,应当用if(p==NULL) 或if(p!=NULL)举行防错处理.
* 内存分配固然成功,但是还没有初始化就引用它.
犯这种错误主要有两个起因:一是没有初始化的见解;二是误认为内存的缺省初值全为零,招致引用初值错误(比方数组). 内存的缺省初值毕竟是什么并没有统一的尺度,固然有些时刻为零值,我们宁可托其无不可托其有.所以无论用何种方法成立数组,都别忘了赋初值,即就是赋零值也不可省略,不要嫌麻烦.
* 内存分配成功并且已经初始化,但操作越过了内存的边界.
比方在利用数组经常常发生下标“多1”大概“少1”的操作.分外是在for循环语句中,循环次数很简单搞错,招致数组操作越界.
* 忘掉了释放内存,造成内存泄露.
含有这种错误的函数每被调用一次就丧失一块内存.刚开始时系统的内存充沛,你看不到错误.终有一次程序忽然死掉,系统呈现提醒:内存耗尽.
动态内存的申请与释放必须配对,程序中malloc与free的利用次数一定要相同,不然必定有错误(new/delete同理).
* 释放了内存却持续利用它.
有三种情形:
(1)程序中的对象调用关系过于复杂,实在难以搞清楚某个对象毕竟能否已经释放了内存,此时应当重新计划数据构造,从根本上办理对象管理的混乱局面.
(2)函数的return语句写错了,注意不要返回指向“栈内存”的“指针”大概“引用”,因为该内存在函数体完毕时被自动销毁.
(3)利用free或delete释放了内存后,没有将指针设置为NULL.招致产生“野指针”.
以上是“<b>C++内存管理详解</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |