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

【C++】--------- 内存管理

目录

C语言内存管理方式:malloc、calloc、realloc和free

C++内存管理方式

new和delete

操作内置类型

操作自定义类型

 operator new与operator delete函数

new和delete的实现原理

定位new表达式的了解

​编辑

内存泄漏


 

C语言内存管理方式:malloc、calloc、realloc和free

它们都用于在堆上开辟连续空间,calloc会进行初始化为0,realloc可以调整之前开辟拍的空间(异地扩容或原地扩容)。相同点是空间开辟成功返回分配内存的指针,开辟失败返回NULL。都需要free释放空间。

C++内存管理方式

C++兼容C语言,C语言的内存管理方式当然还可以使用,但一些场景使用起来就有些麻烦。比如对自定义类型的使用。所以C++也有自己的内存管理方式:new和delete。

new和delete

操作内置类型

注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和 delete[],注意:匹配起来使用。

操作自定义类型

注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。

 operator new与operator delete函数

new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的 全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局 函数来释放空间。

我们通过汇编可以看到operator new是通过malloc申请空间的,operator delete是通过free释放空间的。不过不一样的是C++一般使用抛异常来检查空间是否成功申请。

new和delete的实现原理

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

对于自定义类型:

new的原理

1. 调用operator new函数申请空间

2. 在申请的空间上执行构造函数,完成对象的构造

delete的原理

1. 在空间上执行析构函数,完成对象中资源的清理工作

2. 调用operator delete函数释放对象的空间

new T[N]的原理

1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请

2.在申请的空间上执行N次构造函数

delete[]的原理

1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理

2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间

定位new表达式的了解

定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。

使用场景:定位new表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化,所以如果是自定义类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化。

内存泄漏

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不 是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而 造成了内存的浪费。

内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会 导致响应越来越慢,最终卡死。


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

相关文章:

  • python转转商超书籍信息爬虫
  • 【JVM-9】Java性能调优利器:jmap工具使用指南与应用案例
  • C#使用WMI获取控制面板中安装的所有程序列表
  • 第23篇 基于ARM A9处理器用汇编语言实现中断<五>
  • leetcode347.前k个高频元素
  • oneplus3t-lineageos-16.1编译-android9,
  • 【spark】spark structrued streaming读写kafka 使用kerberos认证
  • 【网络篇】计算机网络——链路层详述(笔记)
  • List<T>属性和方法使用
  • springboot整合kafka
  • 【学习心得】远程root用户访问服务器中的MySQL8
  • 图片分类标注工具python
  • 团队文档管理有困难?总有一款工具合适你
  • 摸鱼小工具-窗口隐藏透明
  • 集团精益智能工厂数字化建设三年规划方案|70页PPT
  • 【ChatGPT】如何利用情景模拟让ChatGPT做决策分析
  • 基于SSM邮票鉴赏系统的设计
  • linux shell脚本后台运行
  • 面试官:说一下Spring 中的 @Cacheable 缓存注解?
  • 3d Max下载|3ds MAX全版本安装教程网盘资源
  • WEB 统一接口返回和异常处理
  • 先来先服务(FCFS,First-Come, First-Served)调度算法
  • 人工智能:重塑未来生活与工作的变革者
  • python-numpy-笔记1
  • 名词(术语)了解--CSSOM (CSS Object Model)
  • SLAM|1. 相机投影及相机畸变