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

内存管理(知识点)

c语言与c++对于内存管理的区别

c语言中动态内存管理方式 malloc\calloc\realloc\free

c++内存管理方式
c++兼容c语言所以c语言中的方式也可以使用 但是用起来太麻烦
所以通过new和delete操作符竞选动态内存管理

单个对象

c语言: int* p2=(int*)malloc(sizeof(int))
c++ : int*p3= new int //自动计算大小,不需要强转 ,不会初始化
free(p2)
delete p3

多个对象

c语言: int* p2=(int*)malloc(sizeof(int)10)
c++ : int
p3= new int[10] //自动计算大小,不需要强转 ,不会初始化
free(p2)
delete[] p3
额外支持开空间和初始化
c++ : intp3= new int[10]{1,2,3}
或 c++ : int
p3= new int[10]{}

malloc没办法很好支持动态申请的自定义对象初始
自定义类型,开空间+调用构造函数初始化
A* p2=new A;
A* p3=new A(3)
自定义类型,调用析构函数+释放空间
delete p2
delete p3

调用显示初始化

A aa1(1);
A aa2(2);

  • p5=new A[10]{aa1,aa2} //给两个 后面默认构造
    delete [] p5
    //匿名对象
  • p5=new A[10]{A(1),A(2)} //给两个 后面默认构造
    delete [] p5
    //隐式类型转换
  • p5=new A[10]{ 1 , 2 } //给两个 后面默认构造
    delete [] p5

operator new 与operator delete函数

(两者要匹配使用!!!)

开辟空间失败时,会抛出异常(除非申请空间特别大 不然基本不会报错)
new和delete是用用户进行动态内存申请和释放的操作符,
operator new 和 operator delete是系统提供的全局函数,
new在底层调用operator new全局函数来申请空间
delete在底层调用operator delete全局函数来释放空间

malloc/free 和 new/delete的区别

首先两者的共同点: 都是从堆上申请空间,并且需要用户手动释放
不同点是:

  • 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/403701.html

相关文章:

  • 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【29】Sentinel
  • 防范UDP Flood攻击的策略与实践
  • 昇思25天学习打卡营第17天 | CycleGAN图像风格迁移互换
  • Leetcode 2520. 统计能整除数字的位数
  • WEB前端08-综合案例(动态表格)
  • 【面试题】Redo log和Undo log
  • 开发实战经验分享:互联网医院系统源码与在线问诊APP搭建
  • springboot系列教程(十六):配置Actuator组件,实现系统监控
  • 单臂路由组网实验,单臂路由的定义、适用情况、作用
  • 【数据结构初阶】顺序表三道经典算法题(详解+图例)
  • SpringBoot接入JPA连接数据库H2或MySQL例子
  • 持续集成05--Gogs的安装与使用
  • C++--fill
  • Java:对比一个对象更新前后具体被修改了哪些值
  • GO——GMP 好文整理
  • 园区AR导航系统构建详解:从三维地图构建到AR融合导航的实现
  • 接口测试总结(非标准)
  • 在Ubuntu 18.04上安装和使用Composer的方法
  • ssm 学习 ---(spring)
  • Jupyter Notebook安装及基本使用
  • Jenkins+Maven+Gitlab+Tomcat自动化构建打包+部署
  • Synchronized升级到重量级锁会发生什么?
  • 【Webpack】HMR 热更新
  • 【计算机视觉】siamfc论文复现
  • PotatoTool 蓝队版 V1.3 发布:增强功能和性能优化
  • pytest常用命令行参数解析
  • pgsql-使用dump命令制作数据库结构、数据快速备份bat脚本
  • 【3D编程技巧】如何用四元数旋转矢量在相机空间进行光照计算
  • ICMP 和 IGMP 的区别
  • 【Vue3】工程创建及目录说明