• C++ 内存模型


    1、内存分区模型

    C++程序在执行时,将内存大方向划分为4个区域

    • 代码区:存放函数体的二进制代码,由操作系统进行管理的(所有代码包含中文注释)
    • 全局区:存放全局变量和静态变量以及常量
    • 栈区由编译器自动分配释放, 存放函数的参数值,局部变量等
    • 堆区由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收 

    内存四区意义:

            不同区域存放的数据,赋予不同的生命周期, 给我们更大的灵活编程

     2、程序运行前

            在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域:

    代码区:

    ​         存放 CPU 执行的机器指令

    ​         代码区是共享的共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可

    ​         代码区是只读的使其只读的原因是防止程序意外地修改了它的指令

    全局区:

    ​         全局变量和静态变量存放在此.

    ​         全局区还包含了常量区, 字符串常量和其他常量也存放在此.

             该区域的数据在程序结束后由操作系统释放. 

    总结:

    • C++中在程序运行前分为全局区和代码区
    • 代码区特点是共享和只读
    • 全局区中存放全局变量、静态变量、常量
    • 常量区中存放 const修饰的全局常量 和 字符串常量

    3、程序运行后

    栈区:

    ​         由编译器自动分配释放, 存放函数的参数值,局部变量等

    ​         注意事项不要返回局部变量的地址,栈区开辟的数据由编译器自动释放

     示例:

    1. int * func()
    2. {
    3. int a = 10;
    4. return &a;
    5. }
    6. int main() {
    7. int *p = func();
    8. cout << *p << endl;
    9. cout << *p << endl;
    10. system("pause");
    11. return 0;
    12. }

    堆区:

    ​         由程序员分配释放,若程序员不释放,程序结束时由操作系统回收

    ​         在C++中主要利用new在堆区开辟内存

    1. int* func()
    2. {
    3. // 利用new关键字,可以将数据开辟到堆区
    4. // 指针 本质上是局部变量,放在栈区,指针保存的数据放在堆区
    5. int* a = new int(10); // new,开辟数据到堆区,返回数据地址
    6. return a;
    7. }
    8. int main() {
    9. int *p = func();
    10. cout << *p << endl;
    11. cout << *p << endl;
    12. system("pause");
    13. return 0;
    14. }

    4 、new操作符

    • C++中利用new操作符在堆区开辟数据
    • 堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符 :delete

    ​         语法:new 数据类型

    ​         利用new创建的数据,会返回该数据对应的类型的指针

    1. int* func()
    2. {
    3. int* a = new int(10);
    4. return a;
    5. }
    6. int main() {
    7. int *p = func();
    8. cout << *p << endl;
    9. cout << *p << endl;
    10. // 堆区的数据,由程序员管理开辟(new),程序员管理释放(delete)
    11. // 利用delete释放堆区数据
    12. delete p;
    13. //cout << *p << endl; //报错,释放的空间不可访问
    14. system("pause");
    15. return 0;
    16. }

    示例:开辟数组

    1. //堆区开辟数组
    2. int main() {
    3. int* arr = new int[10];
    4. for (int i = 0; i < 10; i++)
    5. {
    6. arr[i] = i + 100;
    7. }
    8. for (int i = 0; i < 10; i++)
    9. {
    10. cout << arr[i] << endl;
    11. }
    12. //释放数组 delete 后加 []
    13. delete[] arr;
    14. system("pause");
    15. return 0;
    16. }

  • 相关阅读:
    在idea中创建MyBatis核心配置文件和映射文件的模板、使用模板搭建MyBatis框架
    c++代码格式化工具神器AStyle介绍
    CVE-2022-22965:Spring远程代码执行漏洞
    嵌入式web 服务器boa的编译和移植
    基于springboot红色吕梁网站毕业设计源码150923
    【源码解析】Spring Bean定义常见错误
    【Web前端大作业】基于HTML+CSS+JavaScript制作西北大学新闻网站(7页)
    grep命令用法
    idea下合并两个仓库代码
    Redux-状态管理组件
  • 原文地址:https://blog.csdn.net/sssxlxwbwz/article/details/128060246