当前位置: 首页 > article >正文

C++学习内存管理

1.概念的介绍

总括:

1. 栈(Stack)

  • 存储内容

    • 局部变量(包括函数参数、非静态局部变量)。

    • 函数调用的上下文信息(如返回地址、寄存器状态等)。

    • 特点

      • 内存由编译器自动分配和释放。

      • 生命周期与函数调用相关,函数结束时自动释放。

      • 大小有限,通常较小(几MB)。

      • 访问速度快。

      • 2.堆区

      • 存储内容

        • 动态分配的内存(通过 newmalloc 等分配的内存)。

        • 需要手动管理内存的分配和释放。

      • 特点

        • 内存由程序员手动管理(使用 new/delete 或 malloc/free)。

        • 生命周期由程序员控制,直到显式释放。

        • 大小较大,受系统内存限制。

        • 访问速度较慢。

        • void bar() {
              int* ptr = new int(20); // ptr 指向堆区分配的内存
              delete ptr; // 手动释放堆区内存
          }

        • 3. 静态区(Static/Global Area)

        • 存储内容

          • 全局变量。

          • 静态变量(包括静态局部变量和静态成员变量)。

          • 特点

            • 内存分配在程序启动时完成,程序结束时释放。

            • 生命周期贯穿整个程序运行期间。

            • 访问速度较快。

            • int globalVar = 30; // 全局变量,存储在静态区

              void baz() {
                  static int staticVar = 40; // 静态局部变量,存储在静态区
              }

            • 4. 常量区(Constant Area)

            • 存储内容

              • 常量数据(如字符串常量、const 修饰的常量变量)。

              • 只读数据。

            • 特点

              • 内存分配在程序启动时完成,程序结束时释放。

              • 数据不可修改。

              • 访问速度较快。

              • const int constVar = 50; // 常量变量,存储在常量区
                const char* str = "Hello, World!"; // 字符串常量,存储在常量区

                • 2.new和delete

                  1.new

                  1.int *ptr1=new int;创建一个Int类型的变量

                  2.int*ptr2=new int[10];创建10个int类型的变量。

                  3.int*pt3r=new int[10]{1,2,3,4};这里意思是创建10个int类型的空间,然后将前四个分别初始化为1,2,3,4,然后后面的都初始化为0。

                  4.当int变为自定义类类型的时候,会自动调用构造函数。

                  2.delete

                  1.上面三个地址删除时调用delete,写法分别是,delete ptr1,

                  delete []ptr2,delete[]ptr3;

                  申请连续空间用new[],删除连续的空间delete[]。

                  3.new和delete操作自定义类型

                  当new和delete对自定义类型进行操作时,会自动调用构造函数和析构函数。

                  4.operator new和operator delete

                  new和delete在底层会调用operator new和operator delete进行动态内存空间管理。operator new operator delete它们两个是系统提供的全局函数,new调用opreator new,delete调用operator delete来释放和申请空间。     

                  5.new和delete的实现原理     

                  6.定位new           

                  定位new是在已分配空间的部分调用构造函数初始化对象  ,一般配合内存池使用,因为一般内存池中的类对象是没有初始化的。

                  7.malloc和new的区别

                  1.malloc是函数,new是操作符。

                  2.malloc不会初始化,new会初始化。

                  3.malloc申请空间需要手动计算空间的大小,new可以不同后面直接跟类型(有内置类型int,char等,也有自定义类型date等),如果是多个对象直接在[]里面跟上创建对象的个数即可。

                  4.malloc创建的空间返回的指针是void*,必须强制转换,new可以不用,因为new在使用的时候后面跟了类型。

                  5.malloc开辟空间失败时返回NULL,但是new不会,它会抛出异常。需要来接收。

                  6.申请自定义类型对象时,new会调用构造函数,delete在释放空间前会调用析构函数释放自定义对象的资源,但是malloc和free不会。


http://www.kler.cn/a/588589.html

相关文章:

  • 【NLP 38、实践 ⑩ NER 命名实体识别任务 Bert 实现】
  • STM32 - 在机器人领域,LL库相比HAL优势明显
  • RAG数据嵌入和重排序:如何选择合适的模型
  • .NET_Prism基本项目创建
  • 嵌入式工程师春招面试高频题与参考回答
  • PyTorch 深度学习实战(15):Twin Delayed DDPG (TD3) 算法
  • DeepSeek在学术选题中两个核心提示词
  • Swift 中 associatedtype 的用法详解
  • 自动驾驶之心视觉语言导航!VLN算法与实战课程
  • Ubuntu从源码安装Webots
  • 【Agent】OpenManus-Agent架构详细分析
  • (vue)elementUi中el-upload上传附件之后 点击附件可下载
  • 【实操回顾】基于Apache SeaTunnel从MySQL同步到PostgreSQL——Demo方舟计划
  • C11标准对于C语言的内存模型的描述
  • 移动端自动化测试:Appium进阶技巧与常见问题排查实战指南
  • lua C语言api学习4 编写C模块
  • 颠覆大模型归一化!Meta | 提出动态Tanh:DyT,无归一化的 Transformer 性能更强
  • 【JavaEE】IOC和DI
  • Towards Universal Soccer Video Understanding——论文学习(足球类)
  • K8S下nodelocaldns crash问题导致域名请求响应缓慢