为了账号安全,请及时绑定邮箱和手机立即绑定

听说new,delete调用了malloc,free?

标签:
Java

前言:

C分配和释放动态内存的方式分别是malloc与free,malloc用于分配堆内存,free用于释放堆内存;

C++定义了两个运算符来分配和释放动态内存,运算符new分配堆内存,运算符delete释放new分配的堆内存;

1、new与delete用法简单介绍

new:

用法一:                TypeName  ∗pointer=new  TypeName()用法一:\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ TypeName\ \ *pointer=new\ \ TypeName()用法一:                TypeName  ∗pointer=new  TypeName()

末尾小括号()可有可无,动态分配内存的对象是默认初始化的,调用默认构造函数,()用于初始化的,new返回TypeName类型的指针,如:

vector是泛型类模板,vector<int>是具体类型就与basic_string与string的关系一样

double *p = new double;

double *pp = new double(3.14);

vector<int> *ppp = new vector<int>{1,2,3};


用法二:       TypeName  ∗pointer=new  TypeName[size]()TypeName  ∗pointer=new  TypeName[size]{}

末尾小括号()与{}可有可无,没有的话是未初始化的,()小括号表示值初始化{}采用的是列表初始化,若列表元素数目N小于size,前N个初始化器初始化,后size-N个值初始化,大于size会报错,new返回第一个变量的指针,类型为TypeName,如:

double *p = new double[10];

double *pp = new double[10]{3.14};

vector<int> *ppp = new vector<int>[2]{{1,2,3},{1,2,3}};

new的细节:

细节一:用法一:默认情况下,动态分配内存的对象是默认初始化的,调用默认构造函数;

细节二:用法一:()调用相应的构造函数;

细节三:用法一:与()搭配可以用语法糖auto,auto会自行推断()里的类型,但只能有单个初始化器;

细节四:动态分配的const对象必须显示初始化,对于一个(显示)定义了默认构造函数的类型可以隐式初始化;

细节五:内存耗尽会抛出异常,分配失败会返回空指针;

细节六:动态分配一个空数组是合法的;

delete:

释放new分配的对象内存,delete obj_pointer,释放new分配的数组,delete [] obj_pointer

细节:obj_pointer必须指向new动态分配的内存或空指针,delete会调用析构函数

2、new与delete分配堆内存的细节过程

new的细节过程:

示例:

class AA
{
     public:
        AA(int x,int y){}
 };
AA *pc=new AA(1,1);

AA *pc=new AA(1,1);会转变为三个过程:

第一步为:void* mem = operator new(sizeof(AA));分配内存得到泛型指针,呼应主题的来了,operator new()内部会调用malloc(n),其中n=sizeof(AA);

第二步为: pc = static_cast<AA*> mem 强制类型转换;把得到的泛型指针转换为AA类型的指针;

第三步为:pc->AA::AA(1,1);调用构造函数初始化AA;

delete的细节过程:

示例:

delete AA;

delete的过程比较简单:

第一步:AA::~AA(pc);调用析构函数;

第二步:operator delete(pc);释放内存,呼应主题的来了,operator delete()会调用free(),即free(pc);

array new 为什么要搭配array delete呢?

其实array new分配出来的内存并不等于size*sizeof(class)在其顶部在32位机中分配的内存顶部有一个4个字节大小的内存(cookies)用来count数组的大小,会根据count去准确释放内存,如果array new分配出来的内存用delete去释放内存,也会根据count去准确释放内存,但只会调用一次析构函数,如果这个析构函数里含有释放其他类型的delete,那么此时就会造成内存泄漏,因为只调用了数组第一个对象的析构函数,只会释放第一个析构函数里的delete,剩余部分将会造成内存泄漏!!!

今天的文章就到这里了,欢迎大家批评指正;


作者:勿在浮沙築高台
链接:https://juejin.cn/post/6993340966459408398
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
33
获赞与收藏
206

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消