1.内存的分区模型
c++程序中在执行时,内存分为四个部分
- 代码区:存放函数体的二进制代码,操作系统进行管理(共享,只读,在频繁使用时不会造成资源浪费)
- 全局区:存放全局变量和静态变量以及常量
在代码编译前就会产生的区域 ⬆
栈区和堆区在编译后产生
- 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等(所以不要返回局部变量的地址)
- 堆区:由程序员分配和释放,若程序员没有释放,由程序结束时操作系统回收。主要是使用new再堆区中开辟内存。
有不同的生存周期,更灵活的编程
#include<iostream>using namespace std;int * func(){int a = 10;return &a;//不能返回 局部变量 的地址,局部变量位于栈区}int main(void){int *p = func();cout<<*p<<endl;//第一次可以输出,因为编译器会第一次保留防止误操作cout<<*p<<endl;//第二次输出乱码}4 6 D:\c++\栈区.cpp [Warning] address of local variable 'a' returned [-Wreturn-local-addr]
//利用new在堆区开辟数据#include<iostream>using namespace std;int* func(){int *p = new int(10);return p;}int main(void){cout << *func()<<endl;cout << *func()<<endl;//还是输出10,因为堆区的数据由程序员自己释放。}
应当注意的是,在这里,指针也是局部变量,也是堆区地址。
new操作符:
用于在堆区开辟数据,用delete关键字手动释放内存。
语法 new 数据类型(初始值)new int(10)返回类型是该数据类型的指针,与c语言的malloc略有不同,malloc返回的是无类型指针void*,参数是字节大小。用new开辟数组 new int[10]
