C + + 内存管理 内存管理是C+ + 最令人切齿痛恨的问题,也是C+ + 最有争议的问题,C+ + 高手从中获得了更好的性能,更大的自由,C+ + 菜鸟的收获则是一遍一遍的检查代 码和对C+ + 的痛恨,但内存管理在C+ + 中无处不在,内存泄漏几乎在每个C+ + 程序中都会发生,因此要想成为C+ + 高手,内存管理一关是必须要过的,除非 放弃C+ + ,转到Java 或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C+ + 超绝的性能。本期专题将从内存 管理、内存泄漏、内存回收这三个方面来探讨C+ + 内存管理问题。 1 内存管理伟大的 Bill Gates 曾经失言: 640K ought to be enough for everybody — Bill Gates 1981 程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。1.1 C++内存管理详解1.1.1 内存分配方式1.1.1.1 分配方式简介 在 C++中,内存分成 5 个区,他们分别是堆、栈、自由存储区、全局/静 态存储区和常量存储区。 栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 堆,就是那些由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete。如果程序员没有释 放掉,那么在程序结束后,操作系统会自动回收。 自由存储区,就是那些由 malloc 等分配的内存块,他和堆是十分相似的,不过它是用 free 来结束自己的生命的。 全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的 C 语言中,全局变量又分为初始化的和未初始化的,在 C++里面没有这个 区分了,他们共同占用同一块内存区。 常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。1.1.1.2 明确区分堆与栈 在 bbs 上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初 学者对此往往是混淆不清的,所以我决定拿他第一个开刀。 首先,我们举一个例子: void f() { int* p=new int[5]; } 这条短短的一句话就包含了堆与栈,看到 new,我们首先就应该想到,我们分配了一块堆内存,那么指...