程序的内存模型
-
代码区(共享只读性):存放函数体的二进制代码,由操作系统管理
-
全局区:存放全局变量,静态变量,常量
(程序运行前) -
栈区:由编译器自动分配释放,存放函数的参数值和局部变量
-
堆区:由程序员自行分配或释放,在程序结束后,由操作系统统一回收
(程序运行时)
全局区
int c=10; //全局变量
const int d=10; //const修饰的全局变量,即全局常量
int main()
{
static int a=10; //静态变量,可以被修改,但只能在函数体内被使用
//常量
cout<<"hello world"; //字符串常量
const int b=10; //局部常量
return 0;
}
栈区
//程序运行时形参会被存储在栈区,函数结束时被清空
int* f(int b){
b=100;
int a=10;
return &a;
}
//上述写法可以得到a的地址,但其上的数据已被清空,无意义
//该指针第一次被使用时会得到编译器的保留值,但仅此一次
//在编写代码时应当注意避免返回一个非主函数内的指针
堆区
int *f(){
int *p=new int[10];
//通过new开辟出的空间,存储于堆区,在程序运行完成后被释放
//存放变量p的空间属于栈区
return p;
}
new的使用
int *f(){
int *p=new int[10];
//此处意为开辟一个int型数组空间,并将该数组的首地址赋给p
//数组有十个元素
return p;
}
int main()
{
int *p=f();
delete []p //清空数组内的数据时必须在数组名前加[]
return 0;
}