内存的基本构成
- 可编程内存在基本上分为这样的三大部分:静态存储区、堆区(动态存储区)和栈区。
- 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间(或者整个函数区间内)都存在。它主要存放静态数据(static)、全局数据(函数外)和常量(const)。
- 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放,但是分配的内存容量有限。
- 堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。
例如
char* p = “Hello World”;静态存储区(常量)
char a[] = “Hello World”;栈区
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b;// 栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //"123456\0"在常量区,p3在栈上。
static int c =0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
参考:
http://www.cnblogs.com/emanlee/archive/2009/04/12/1434278.html