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

C++动态内存管理

动态内存

在C/C++程序中(线程)栈空间是有限的,大部分变量使用的都是动态分配来的堆内存,这些动态申请来的堆内存是需要开发者通过代码去自行管理的。如何管理好这些动态申请来的内存,是C/C++开发中的一个重点难点问题。

malloc是开空间

calloc开空间+初始化

realloc在原来的空间增加空间(原地扩+异地扩)

int* p1=new int 申请一个int空间

int* p2=new int[10] 申请十个int空间

int* p3=new int(10) 申请一个int空间,并初始化

int* p4=new int[10]{1,2,3,4}申请10个int空间,并依次初始化,其余置0 c++11才支持

delete p1

delete[] p2

delete p3

delete[] p4

对于内置类型而言,用malloc和new,除了用法不同,其余都是相同

他们的区别在于自定义类型

malloc只开空间,new开空间+调用构造函数

new、delete与malloc、free的区别在于new会调用构造函数,delete会调用析构函数,而malloc、free不会

new先开自定义类型空间,再调用构造函数,对其初始化

delete先清理初始化的空间,再对自定义类型进行释放

失败的处理方式不同

malloc失败,返回空指针

new失败,抛异常

operator new与malloc的功能是一样的,但operator new失败会抛异常

operator new是封装了malloc加了个抛异常,让new去调用他

new的底层原理

去调用call operator new   call  operator new

去调用对应的构造函数  call stack::stack

new=operator new+构造函数

自定义类型

new原理

调用operator new函数申请空间,在申请空间上执行构造函数,完成对象的构造

delete原理

在空间上执行析构函数,在operator delete函数释放空间的空间

new[]原理

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

delete原理

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

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

定位new表达式

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

stack obj=)stack* operator new(sizeof(stack))

new(obj) stack(4)

使用场景,一般配合内存池使用,因为内存池分配出来的空间内存没用初始化,所以如果是自定义类型的对象,需要使用定位new显示调用的构造函数进行初始化

malloc、free和new/delete的区别

相同

malloc/free和new/deletede共同点是:都是从堆山申请空间,并且需要手动释放

不同

malloc和free是函数,new\delete是操作符

malloc申请的空间不会初始化,new可以调用构造函数初始化

malloc申请空间时,需要手动计算空间大小并传递,new只需要在其后跟上空间的类型即可,如果是多个对象,[]中指定对象个数即可

malloc返回值是void* 在使用时必须强转,new不需要,因为new后跟的时空间的类型

malloc申请空间时报时,返回的是NULL,因此使用时必须判定,new不需要,但new需要捕获异常

申请自定义类型对象时,malloc\free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象初始化,delete在释放空间前会调用析构函数完成空间中的资源的清理

内存泄漏

内存泄漏是指针丢了找不到,找不到指针释放不了空间。

http://www.lryc.cn/news/148132.html

相关文章:

  • SpringBoot—日志
  • 如何在,Linux中安装Luajit2.*
  • 单片机-如何让数码管动态显示
  • 在Visual Studio 2017上配置并使用OpenGL
  • 【C++】多态学习
  • 大数据之Maven
  • 自制centos7.9的wsl发行版
  • 使用VisualStudio制作上位机(五)
  • ChatGPT在医疗领域可应用于改善与患者的沟通
  • 直播预告|博睿学院第四季即将开讲:博睿数据资深运维团队现身说法!
  • 端到端自动驾驶综述
  • mysql索引、事务、存储引擎
  • 【CMU15445】Fall 2019, Project 2: Hash Table 实验记录
  • PMP证书是不是烂大街了?
  • Mac下Docker Desktop安装命令行工具、开启本地远程访问
  • Java实现根据商品ID获取京东商品详情数据,1688商品详情接口,1688API接口封装方法
  • element-plus指定el-date-picker的弹出框位置
  • 游戏陪玩语音聊天系统3.0商业升级独立版本源码
  • TCP/IP网络江湖武艺传承:物理层与通信江湖的幕后(物理层中篇:物理层与现代通信技术)
  • Nuxt 菜鸟入门学习笔记三:视图
  • Python Opencv实践 - 霍夫线检测(Hough Lines)
  • Weblogic漏洞(四)之 CVE-2018-2894 任意文件上传漏洞
  • C++:string的[ ],at,push_back
  • C语言(第三十六天)
  • 005_C++数学库常用函数
  • Briefings in Bioinformatics投稿经验分享
  • 【原创】jmeter并发测试计划
  • 飞腾PSPA可信启动--1 非对称加密
  • 基于RabbitMQ的模拟消息队列需求文档
  • “北科Java面试宝典(211最详细讲解)“