C++内存分区模型
内存分区模型
分区名 | 存储内容 |
代码区 | 存放函数体的二进制代码,由操作系统进行管理 |
全局区 | 全局变量,静态变量,常量,在程序执行结束后由操作系统管理 |
栈区 | 由编译器自动分配,释放,存放函数的参数值,局部变量 |
堆区 | 由程序员分配释放,程序运行结束,由操作系统回收 |
在程序未执行前就生成的区域
1代码区
作用:存放cpu机器指令
特点:
1共享的,频繁执行的程序需要在内存中存在一份
2只读的,防止程序的指令被意外的修改
2全局区
作用:存放全局变量和静态变量(static修饰的局部变量),还包括了常量区,常量区分为字符串常量和其他常量(const修饰的全局变量)
3栈区
作用:存放函数的参数值和局部变量(普通局部变量和const修饰的局部变量)
注意事项:不要返回局部变量的地址,其内存由编译器自动释放,访问该地址的指向的内存没有意义,在释放内存后,第一次访使用地址访问内存,编译器保留数据,第二次及以后访问将不再保留
4堆区
作用:由程序员分配和释放,在程序执行完毕后,由操作系统管理
使用new和delete关键字分配和释放内存
#include<iostream> using namespace std; //使用new关键字为一个变量分配内存 int *func() { //new关键字返回的是一个地址 //语法 new int(变量的值); int *p = new int(10); return p; } void test01() { int *p = func(); cout << *p << endl; cout << *p << endl; cout << *p << endl; //使用delete关键字释放一个变量的内存 delete p; cout << *p << endl; p = nullptr; } void test02() { //使用new关键字为数组分配内存 //语法 new int[数组长度]; int *arr = new int[10]; for (int i = 0; i < 10; ++i) { arr[i] = i + 100; } for (int i = 0; i < 10; ++i) { cout << arr[i] << endl; } //使用delete关键字释放数组所占用的内存 //语法delete[] 指向数组首址的指针; delete[] arr; } int main() { // test01(); test02(); system("pause"); return 0; }
分配方式:C++中使用new 关键字分配内存
4堆区
路漫漫其修远兮,吾将上下而求索。