1. 内存分区模型
C++程序内存4个区:
代码区:函数体的二进制代码
全局区:全局变量、静态变量和常量
栈区:函数参数、局部变量。编译器分配。
堆区:程序员分配和释放。若不释放,程序结束后操作系统回收。
内存四区意义: 不同的生命周期,更灵活。
1.1 程序运行前
程序编译后,生成exe可执行程序,在执行程序前,已经有代码区、全局区。 代码区: 存放CPU执行的机器指令
代码区是共享的,因此频繁执行的程序,只要在内存里存一份。
代码区是只读的,避免程序被意外修改。
全局区: 存放全局变量、静态变量和字符串常量、全局常量。 该区域数据由操作系统控制。
函数体外的是全局变量。
static修饰的是静态变量:static int s_a = 0;
常量有字符串常量("hello"
),const修饰的全局变量(const int c_a = 10;
)。
1.3 程序运行后
栈区: 编译器分配,存放函数参数、局部变量等 注意:不要返回局部变量地址,因为栈区地址由编译器控制。 错误示范:
int * func() { int a = 10; return &a; } int main() { int *p = func(); cout<< *p << endl; cout<< *p << endl; }
1.3 new 操作符
堆区:
程序员分配。
在C++中,用new在堆区开辟内存。
语法:new 数据类型
会返回该数据对应的类型指针,如果是数组,则返回第一个元素的地址。
e:
new 一个整型,值为10.int * p = new int(10);
new 一个有10个元素的整型数组:int * arr = new int[10]
int * arr = new int[10]; for (int i=0; i < 10; i++){ arr[i] = i + 100; }
释放内存用delete
:
语法:
释放单个数据:delete p;
释放数组:delete[] arr;
示例:
int * func() { int * p = new int(10); return p; } int main() { int *p = func(); cout<< *p << endl; cout<< *p << endl; }