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