学习 c++如果不了解内存分配是一件非常可悲的事情。而且,可以这样讲,一个 C++程
序员无法掌握内存、无法了解内存,是不能够成为一个合格的 C++程序员的。
一、内存基本构成
可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不
同,对他们使用方式也就不同。
静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间
都存在。它主要存放静态数据、全局数据和常量。
栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束
时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是
分配的内存容量有限。
堆区: 亦称动态内存分配。程序在运行的时候用
释放内存。 动态内存的生存期可以由我们决
定,如果我们不释放内存,程序将在最后才释放掉动态内存。但是,良好的编程习惯是:
如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。
二、三者之间的区别
我们通过代码段来看看对这样的三部分内存需要怎样的操作和不同,以及应该注意怎
样的地方。
例一:静态存储区与栈区
char* p = “Hello World1”;
char a[] = “Hello World2”;
p[2] =‘A’;
a[2] =‘A’;
char* p1 = “Hello World1;”
这个程序是有错误的,错误发生在 p[2] = ‘A’这行代码处,为什么呢,是变量 p 和变量
数组 a 都存在于栈区的(任何临时变量都是处于栈区的,包括在 main()函数中定义的变
量)。但是,数据 “Hello World1”和数据“Hello World2”是存储于不同的区域的。
因为数据“Hello World2”存在于数组中,所以,此数据存储于栈区,对它修改是没有任
何问题的。因为指针变量 p 仅仅能够存储某个存储空间的地址,数据“Hello World1”为字符
串常量,所以存储在静态存储区。虽然通过 p[2]可以访问到静态存储区中的第三个数据单
元,即字符‘l’所在的存储的单元。但是因为数据“Hello World1”为字符串常量,不可以改变,
所以在程序运行时,会报告内存错误。并且,如果此时对 p 和 p1 输出的时候会发现 p 和 p1
里面保存的地址是完全相同的。换句话说,在数据区只保留一份相同的数据。来源 : 考试