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堆区

posted @ 2020-08-03 16:44  DNoSay  阅读(104)  评论(0编辑  收藏  举报