C++内存 = 代码区 + 全局区 + 栈区 + 堆区
代码区:存放CPU执行的机器命令(运行前)
1.共享的
2.只读的
全局区:存放全局变量和静态变量和常量区(普通常量、const开头的全局变量)(运行前)
1.在程序结束之后由操作系统释放
ps:const修饰的局部变量离局部变量比较近。
栈区:函数的参数,局部变量等(运行时)
1.编译器自动分配释放(编译器会给你保留一次,防止误操作)
ps:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放
堆区: 通过new在堆区开辟内存(new返回的开辟的内存的指针)(运行时)
1.由程序员分配释放,若程序员不释放,程序结束时由操作系统回收
Ps;如果new出来的空间在未使用的时候不释放会造成内存泄漏
new的理解:
int main(){
int *p = new int(10);//p是局部变量,在堆;10是new出来的,在堆区
// int *p = new int[10];创建的数组 数组释放加[] 比如 delete[] p;
return 0;
}
new的数据内存存活在堆区,p在栈区存在,保存着堆区10的地址。
补充:
往往在内存模型图可以看到.bss区和.data区,这俩共同构成全局区。
.bss区: main()函数执行前未能确定值的全局变量/静态变量
.data区:main()函数执行前就能确定值得全局变量/静态变量
PS:
static修饰的函数告诉编译器他要操作静态变量,并不意味着他的保存位置!