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

内存管理c/c++

new delete

new和delete是c++两个关键字,负责开辟动态空间和销毁空间,和malloc和free很像。但是两者还是有区别的,祖师爷也是觉得c语言开辟堆空间的方式太麻烦。于是,把他们封装成了函数,分别由new和delete调用,也就是说,new和delete的底层原理还是调用malloc和free。对于内置类型来说,new和delete可能没什么太大作用。最多就是简化了一下代码。但是如果是对象的动态开辟就有很大区别了。因为对象的创建是必须要初始化的,但是malloc不会初始化。对于对象创建,我们需要先开辟空间,再调用构造函数;对于对象销毁,我们需要先调用析构函数,再free空间。而把他们两个封装成函数的函数就是,operator new 和operator delete 。

定位new

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

使用格式:

  • new (place_address) type或者new (place_address) type(initializer-list)
  • place_address必须是一个指针,initializer-list是类型的初始化列表

定位new对于c++初期了解就可以了,它的使用并不是很广。一般会配合内存池使用,提高效率。虽然这种需求比较少,但是确实有这种场景。所以,他的存在还是有道理的。

malloc/free与new/delete区别

从本质看:malloc/free是函数 ,而new/delete是操作符。这个和sizeof和strlen是一样的。

从用法功能看:

  • mallloc开辟失败会直接返回空指针,而new基于对象的特性会抛出异常,这是对象和过程的一个区别。
  • malloc开辟空间需要手动计算大小,而new只需要指定类型和个数即可,推算出大小。
  • malloc返回值是void*,需要强转。而new不需要,他后面直接跟着类型

从底层看:free会直接释放掉空间。而delete不仅仅会释放掉空间,还会调用析构函数。new和malloc的区别也是在这里,new会先开辟空间,再调用构造函数,而malloc只是单纯的开辟空间。其实new和free与malloc/free的区别明显是基于对象的。因为对象的创建必须初始化,在生命周期结束的时候需要自动调用析构函数。而c语言的malloc/free是完成不了的。

内存泄漏

内存泄漏这个问题对于普通程序的没有什么大问题。这和我们普通程序使用时间是短期和虚拟进程地址有关。实际上你写的程序是不会真正的占用物理内存的。要不然,你随便写个程序就把你的电脑弄崩溃了。那这怎么可能?我们的编译器没有这么傻的。

对于服务器上的程序,长期运行的。比如王者服务器上的程序,你可想象一下,你无论在什么时候打开游戏都是可以正常运行的。除了他规定的更行时间。如果,王者的服务器上的程序出现了一个内存泄漏的代码。而且还是一次泄露1MB,刚开始你还发现不了,那这多恐怖。不知道哪天你的程序就崩了。数据全泄露没了。你的游戏记录,充值的点券都没了。你想想,这是什么局面?

所以,我们平常写程序,尤其检查动态开辟的空间,记得释放。


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

相关文章:

  • 鸿蒙项目实战:PR#39888中解决的ACE引擎具体问题及技术方案赏析
  • Android 端侧运行 LLM 框架 MNN 及其应用
  • 【Linux】消息队列和信号量
  • 问题修复-后端返给前端的时间展示错误
  • Pytorch使用手册—Raspberry Pi 4 上的实时推理(30 FPS!)(专题三十六)
  • QEMU源码全解析 —— 内存虚拟化(23)
  • 语法Object.defineProperty()
  • YashanDB简介
  • Java 设计模式:软件开发的精髓与艺
  • FunPapers[3]:WWW‘25「快手」生成式回归预测观看时长
  • Makefile、Make和CMake:构建工具的三剑客
  • 字符串的原理
  • 水果识别系统 | BP神经网络水果识别系统,含GUI界面(Matlab)
  • 数学建模:MATLAB极限学习机解决回归问题
  • 大白话页面加载速度优化的工具与实践案例
  • 从头开始学SpringMVC—04文件处理拦截器异常处理执行流程
  • JavaScript 输入输出语句
  • HumanPro逼真角色皮肤面部动画Blender插件V1.1版
  • 蓝桥杯备考:从记忆化搜索到动态规划
  • 微服务学习(5):消息转换器由JDK序列化——JSON序列化