new和malloc的区别与联系
我们都知道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创建的动态对象
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/93934.html