内存分区模式
c++在执行时,将内存分为四个区域:代码区,全局区,栈区,堆区。而在程序执行之前程序分为两个区域:代码区和全局区。
代码区
存放内容
代码区存放cpu执行的机器指令,即二进制代码。
特点
1 共享,代码区中存放的指令时共享的,这样即使是被频繁执行的代码也只需要在内存中存放一份即可。
2 只读,这个性质可以防止指令在执行过程中被意外修改。
全局区
存放内容
存放全局变量,静态变量,以及各种常量,const修饰的全局/局部变量
特点
该区域的数据在程序结束之后由操作系统释放
示例
#include <iostream>
int g-test = 10;//全局变量
const int c-g-test = 10;//const修饰的全局常量(const修饰的变量可以认为是常量)
int main()
{
static int s-test = 10;//静态变量
cout << "全局变量的地址;" << (int)&g-test << endl;
cout << "全局常量的地址:" << (int)&c-g-test << endl;
cout << "静态变量的地址:" << (int)&s-test << endl;
cout <<"字符串常量的地址:" << (int)&"hello world" << endl;
system ("pause"):
return 0;
}
根据这些地址编号我们可以判断这些数据大致储存在一个相同的区域。
栈区
存放内容
存放函数的参数值和局部变量。
特点
由编译器自动分配释放。
示例
#include <iostream>
int func()
{
int a = 0;
return a;
}
int main()
{
int test = 0;
test = func():
cout << test << endl;
cout << tset << endl;
system ("pause");
return 0;
}
第一次可以打印出正常的数字是因为编译器在释放内存之后做了一次保留,所以第二次打印出的数字是随机数。在一个函数结束后编译器就会释放这个函数执行时在栈区占用的空间。
堆区
存放内容
由程序员决定
特点
由程序员分配和释放,程序结束后由操作系统回收。分配空间利用函数new,释放空间利用函数delete。
示例
#include <iostream>
int main()
{
//开辟空间
int* p1 = new int(10);//10是开辟的空间上存储的数字而不是开辟的空间的大小
int* p2 = new int[10];//这里10是开辟的空间的数量,一个空间的大小和int所占的内存相同。
//释放空间
delete p1;
delete[] p2;
return 0;
}