踏入C++中的雷区——C++内存管理详解
2006-04-25 09:22 作者: 出处: 计算机教学网 责任编辑:方舟
伟大的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!