首页 > 其他分享 >new和malloc的区别

new和malloc的区别

时间:2023-02-03 23:35:20浏览次数:40  
标签:malloc 调用 区别 内存 operator new delete

从表层调用来看:

1. 名称/语法

一个是操作符,一个是调用函数(cdecl)

int *v1 = new int;//无需指定内存块的大小
int *v2 = (int*)malloc(sizeof(int));//需显式指出内存块的大小
delete v1;
free(v1);

2. 申请内存

​ 动态申请内存时,对于类的实例化对象,new/delete会调用对象的构造函数/析构函数以完成对象的构造/析构。而malloc则不会

new操作符分配对象内存:

  1. 调用operator new 函数(对于数组是operator new[])分配一块足够大的,原始的,未命名的内存空间以便存储特定类型的对象。
  2. 编译器运行相应的构造函数以构造对象,并为其传入初值。
  3. 对象构造完成后,返回一个指向该对象的指针。

delete操作符释放对象内存:

  1. 调用对象的析构函数。
  2. 编译器调用operator delete(或operator delete[])函数释放内存空间。

3. malloc调用的是进程默认堆,而new既可以调用进程默认堆,又可以调用自定义堆

特征 new/delete malloc/free
分配内存的位置 自由存储区
内存分配返回值 完整类型指针 void*
内存分配失败返回值 默认抛出bac_alloc异常 返回NULL
分配内存的大小 由编译器根据类型计算得出 必须显式指定字节数
处理数组 有处理数组的new版本new[] 需要用户计算数组的大小后进行内存分配
已分配内存的扩充 无法直观地处理 使用realloc简单完成
是否相互调用 可以,看具体的operator new/delete实现 不可调用new
分配内存时内存不足 客户能够指定处理函数或重新制定分配器 无法通过用户代码进行处理
函数重载 允许 不允许
构造函数与析构函数 调用 不调用

从源码的底层实现来看,两者并无差别

1. new/delete

​ new->LocalAlloc->RtlAllocateHeap
​ delete->LocalFree->GlobalFree->RtlFreeHeap

2. malloc/free

​ malloc->RtlAllocateHeap
​ free->RtlFreeHeap

标签:malloc,调用,区别,内存,operator,new,delete
From: https://www.cnblogs.com/XiuzhuKirakira/p/17090699.html

相关文章

  • C# 中 IsNullOrEmpty 和 IsNullOrWhiteSpace使用与区别
    一、概述C#中判断字段或者字符串是否为空或者NULL的时候,我们通常使用IsNullOrEntity和IsNullOrWhiteSpace函数进行判断,但是这两个函数在大部分情况得出的结果是一致的,但是......
  • 指针和引用的区别
    指针和引用的对比指针是一种数据类型,它是专门用来存放地址的变量引用实际上是一种隐式指针,它是对象建立的一个别名,通过&来实现。不同点1、指针是一个变量,只不过这个变......
  • 抽象类(abstract class)和接口(interface)有什么区别?
    #yyds干货盘点#1、接⼝的⽅法默认是public,所有⽅法在接⼝中不能有实现(Java8开始接⼝⽅法可以有默认实现),⽽抽象类可以有⾮抽象的⽅法。2、接⼝中除了static、final......
  • 抽象类(abstract class)和接口(interface)有什么区别?
    1、接⼝的⽅法默认是public,所有⽅法在接⼝中不能有实现(Java8开始接⼝⽅法可以有默认实现),⽽抽象类可以有⾮抽象的⽅法。2、接⼝中除了static、final变量,不能有其他......
  • gin框架-参数绑定方法ShouldBind和BindJSON的区别
    Gin框架踩坑—[GIN-debug][WARNING]Headerswerealreadywritten.Wantedtooverridestatuscode400with200复现场景:使用结构体绑定方式接受参数,参数绑定失败,代码......
  • moore状态机和mealy状态机区别
    直接给出结论:根据状态机的输出是否与输入条件相关来区分Moore状态机和Mealy状态机。Moore状态机:输出仅仅与当前状态有关;如下实例,如三段式写法来写的一个序列检测的状态......
  • .NET、C#和ASP.NET三者之间的区别
      .NET、C#和ASP.NET三者之间的区别如下:一、什么是.NET?.NET是微软公司下的一个开发平台,.NET核心就是.NETFramwork(.NET框架)是.NET程序开发和运行的环境,在这个平台下......
  • String_StringBuff_StringBuild的区别
    最近在看面试题,stringbuffer和stringbuild也是经常会问到的,而在写代码的过程中,用到这两者都很少,一般都是string,如果要对字符串经常进行更改,那么stringbuffer和stringbu......
  • java Comparator和Comparable的区别?
    参考:https://blog.csdn.net/m0_71087031/article/details/124850080Comparable是一个内比较器,可以和自己比较的Comparator是一个外比较器,方法有两个参数To1和To2,是泛型......
  • 详解 CALayer 和 UIView 的区别和联系
    前言前面发了一篇iOS面试的文章,在说到UIView和CALayer的区别和联系的时候,被喵神指出没有切中要点,所以这里就CALayer和UIView这个问题重新整理了下。这里会先分条......