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

C++ -- 内存管理

C++ --内存管理

  • 1. C/C++内存分布
  • 2. C中动态内存管理
  • 3. C++中动态内存管理
  • 4. 面对自定义类型
  • 5. operator new和operator delete
  • 6. new和delete的实现原理
    • 6.1 内置类型
    • 6.2 自定义类型
  • 7. 定位new(placement new)
    • 7.1 底层机制
    • 7.2 本质

1. C/C++内存分布

在这里插入图片描述

2. C中动态内存管理

C中动态内存管理

3. C++中动态内存管理

区别于C中多样的方式,如malloc、calloc和realloc,以及释放内存的free,C++中常用的动态内存管理方式是new和delete。
使用的方法也很简单

int main()
{int* p1 = new int(4);int* p2 = new int[10] { 1, 2, 3, 4 };// 创建连续空间// 初始化与否取决于你delete p1;delete[] p2;// 释放时最好匹配return 0;
}

new除了用起来方便和malloc用法上没什么区别,不同的是new可以初始化参数而malloc只能手动初始化。

4. 面对自定义类型

在面对自定义类型时,new和delete会自动调用构造函数和析构函数。如果一次性创建了多个自定义类型,创建了几个就会调用几次构造函数和析构函数。
在这里插入图片描述

5. operator new和operator delete

new和delete是操作符,operator new和operator delete是操作系统提供的全局函数。new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。operator new 实际也是通过malloc来申请空间,如果用户提供该措施就继续申请,否则就抛异常。operator delete 最终是通过free来释放空间的

6. new和delete的实现原理

6.1 内置类型

new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。

6.2 自定义类型

new的原理
先调用operator new开辟空间,再调用构造函数在这块空间上完成构造。
在这里插入图片描述
delete的原理
先调用析构函数释放空间上的资源,再调用free释放这块空间。
在这里插入图片描述

7. 定位new(placement new)

定位new是在已开辟的空间上调用构造函数初始化一个对象。核心作用是将对象构造与内存分配解耦,适用于需要精确控制内存布局或优化性能的场景。

7.1 底层机制

与普通new的区别:
定位new跳过operator new开辟空间,直接调用构造函数。

7.2 本质

定位new本质是operator new的重载版本,接受额外参数(地址)。

http://www.xdnf.cn/news/3980.html

相关文章:

  • 探寻适用工具:AI+3D 平台与工具的关键能力及选型考量 (AI+3D 产品经理笔记 S2E03)
  • Java面试:微服务与大数据场景下的技术挑战
  • 《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-《5G通信速成:MATLAB毫米波信道建模仿真指南》
  • MySQL JOIN详解:掌握数据关联的核心技能
  • 【翻译、转载】【译文】模型上下文协议(Model Context Protocol, MCP)简介
  • java技术总监简历模板
  • Q_OBJECT宏的作用
  • 3.9/Q2,Charls最新文章解读
  • 基于 AI 的人像修复与编辑技术:CompleteMe 系统的研究与应用
  • 网络编程,使用select()进行简单服务端与客户端通信
  • 56、【OS】【Nuttx】编码规范解读(四)
  • NV214NV217美光闪存固态NV218NV225
  • Jasper and Stella: distillation of SOTA embedding models
  • P1802 5 倍经验日
  • 【AI提示词】 复利效应教育专家
  • Python实例题:Python获取NBA数据
  • 大连理工大学选修课——图形学:第三四章 基本图形生成算法
  • 低速总线:IIC和SMBUS
  • JAVA---继承
  • avx指令实现FFT
  • 【Linux系统】互斥量mutex
  • 当SONiC遇到CPO,SONiC对共封装光接口的管理
  • 在两个bean之间进行数据传递的解决方案
  • langchain中 callbacks constructor实现
  • 如何使用python保存字典
  • **马小帅面试记:Java技术问答**
  • 邮件协议、签名与推送
  • Learning vtkjs之MultiSliceImageMapper
  • 【C++】Docker常用语法
  • VTK入门指南