new与delete的用法,new与delete

  new与delete的用法,new与delete

  Yyds干货库存

  大家好,我是小杰。

  我的主页:畅游码海

  欢迎关注,共同进步!

  我们在拿着《C++ primer plus》和《C++ primer》这两本经典的书的时候,书上明确说了我们需要使用new和delete,在堆中请求和释放内存的时候new []和delete []必须成对使用。但我们就是知道要记住,但大多只知道为什么,不知道为什么。那么今天就来深入的聊一聊,为什么要成对使用,如果我不用成对使用会怎么样。

  new和delete到底做了什么?我们先来看一张经典图片:

  从这幅图中我们可以清楚地看到:

  C应用程序有三种方式在堆中分配内存:

  应用—C标准库—新增、删除相关—malloc和free— HeapAlloc、VirtualAlloc(操作系统API)应用—新增、删除相关—malloc和free— HeapAlloc、VirtualAlloc(操作系统底层API)应用—malloc和free— HeapAlloc、VirtualAlloc(操作系统底层API)应用— HeapAlloc、VirtualAlloc(操作系统底层API)我们可以看到以下几点:

  操作系统的API是我们开发应用时绕不开的东西,但是直接调用操作系统的API在大多数情况下并不是我们所需要的,因为我们更多的时候需要编写多平台的代码,而不是针对某个操作系统来编写。虽然我们调用new和delete,但其本质是malloc调用的一个对象的“Object* obj=new Object”和C语言库中使用的free函数(后面我们会重点介绍和研究)。//出生

  Delete obj //Destroy这是我们的新对象然后调用Delete删除这个对象,那么它的本质是什么?

  从编译器的角度来看,我们的新操作大致是这样的:

  Object * obj

  尝试{

  void * mem=operator new(sizeof(Object));//分配内存

  obj=static _ cast Object *(mem);//指针转换

  obj-Object:Object();//原位结构

  }

  catch( std:bad_alloc ){

  //如果失败,则不执行构造。

  }operator new本质上是分配内存,调用malloc函数,我就不详细写出来了。如果有兴趣,请联系我沟通。在编译器看来,我们的删除操作是什么样的:

  PC-~ Object();//首先销毁

  运算符删除(obj);//释放内存操作符delete本质上是释放内存,调用free函数,我就不详细写出来了。

  看new []删除[]object * obj=new object[3];//三级结构

  删除[]对象;//从上面可以看出三个析构。根据知识转移,当我们申请一个对象数组时,也会经历这个过程。有些对象会多次调用构造函数,有些对象会多次调用析构函数。我们申请的内存数组会在数组头存储一些相关信息,具体大小和编译器的实现有关。但是会记录这个数组的编号。因此,我们构造时间==毁灭时间。

  想想传说中的,如果不删除[]释放内存,为什么会出现内存泄漏?

  其实本质上并不是这样。即使我们用delete和new []来匹配,这里也不会出现内存泄漏。因为在数据头标了数字,所以这块内存肯定是空闲的。内存泄漏是什么意思?

  实际上这会导致这三个对象的析构函数只被调用一次,也就是最上面的析构函数,其他两个的析构函数都不会被调用。所以现在我明白了,内存泄漏指的是这个对象应用的内存。因为没有调用析构函数,所以那个内存块不会被释放,所以内存泄漏。

  以此类推,如果我们的新对象不是对象而是内置类型,或者对象不包含指向其他堆内存的指针,那么理论上,即使我们不使用delete,也不会造成内存泄漏。但是,平时还是要遵守的。这是个好习惯,各种奇怪的问题混在一起就不会出现了。这其实对我们自己也有好处。

  ,

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • office2010激活密钥大全 怎么永久激活office2010
  • project2010产品密钥免费_project2010激活密钥永久激活码
  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • chatgpt是什么?为什么这么火?
  • ChatGPT为什么注册不了?OpenAI ChatGPT的账号哪里可以注册?
  • OpenAI ChatGPT怎么注册账号?ChatGPT账号注册教程
  • chatgpt什么意思,什么是ChatGPT ?
  • CAD中怎么复制图形标注尺寸不变,CAD中怎么复制图形线性不变
  • cad中怎么创建并使用脚本文件,cad怎么运行脚本
  • cad中快速计算器的功能,cad怎么快速计算
  • cad中快速修改单位的方法有哪些,cad中快速修改单位的方法是
  • cad中心点画椭圆怎么做,cad轴测图怎么画椭圆
  • CAD中常用的快捷键,cad各种快捷键的用法
  • 留言与评论(共有 条评论)
       
    验证码: