欢迎光临散文网 会员登陆 & 注册

new和malloc的区别与联系

2022-11-19 17:40 作者:钢厂小霸王_X  | 我要投稿


我们都知道new和malloc都可以用来申请空间,但为什么有了malloc/free为什么还要new/delete?如果new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这些将是我接下来要讨论的问题。。。

首先,我们先来了解一下new和malloc之间的区别:

  • 属性方面

    new/delete作为C++关键字,需要编译器支持。malloc/free属于库函数,需要头文件(stdlib.h)支持。

  • 参数方面

    new申请内存无需指定内存大小,编译器会根据类型信息自行计算。除此之外,new会调用构造函数。

    malloc必须由我们计算需要申请的字节数,需要指出所需内存的尺寸,并且返回后强行转换为实际类型的指针。而且malloc只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值是随机的。

通过new申请空间
通过malloc申请空间
  • 返回类型

    new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。

new返回的是对象类型的指针
malloc返回void *
  • 分配失败方面

    new内存分配失败的时候,抛出bad_ alloc异常 ;malloc分配内存失败时返回NULL。

  • 自定义类型

    new会先调用operator new函数,申请足够的内存(通常底层使用malloc实现).然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存(通常底层使用free实现)。

    malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。

  • 重载

    C++允许重载new/delete操作符,而malloc是库函数不允许重载。

  • 内存区域方面

    new在自由储存区分配内存,malloc在堆上分配内存。

    自由存储区(free store)是C++中通过new和delete动态分配和释放对象的抽象概念(逻辑概念),通过new来申请的内存区域可称为自由存储区,通过delete归还内存。

    是操作系统所维护的一块特殊内存,是一个物理概念,它提供了动态分配的功能,当运行程序调用malloc()时就会从中分配,调用free()归还内存。

  • 效率方面

    对于new和delete,对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。所以说new的效率高于malloc。

最后我们再来解决一下开头提到的问题:

  • 有了malloc/free为什么还要new/delete?

    因为C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete,讲究一个效率。对于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。但对于非内部数据类型(需要用户自己定义),new和malloc的区别就显而易见。

  • 既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?

    C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。

    如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,结果也会导致程序出错。所以new/delete必须配对使用,malloc/free也一样。

free释放new创建的动态对象



new和malloc的区别与联系的评论 (共 条)

分享到微博请遵守国家法律