malloc 和new的区别

来源:互联网 发布:粒子滤波算法流程图 编辑:程序博客网 时间:2024/04/30 06:19

大笑new和malloc是经常会被人问到的问题,那么他们到底有哪些区别呢??其实他们有很多区别,以下是我总结了一些点::::


一:是否调用构造函数和析构函数

使用new不仅会分配空间,而且还会构造对象

使用new会有三个阶段:

<1>调用operator new函数(new的重载,数组为operator new[])分配一块儿“原始的,未命名的,足够大的内存空间以便存储特定类型的对象。

<2>调用相应的构造函数用来构造此对象

<3>对象构造完成之后,返回指向该对象的指针(this)

用new构造对象后,须将其析构:delete

<1>调用对象的析构函数

<2>调用operator delete()重载函数(数组为operator delete[]),释放内存空间

但是调用malloc只会申请空间,不会调用构造函数来构造对象

********************************************************************************************************************************************************

二:对数组的申请

c++提供了new[]和delete[]用来处理数组

new时它会分别调用构造函数初始化每一个数组的元素,释放对象的时候每个对象调用析构函数,而且new[]和delete[]必须配套使用,不然可能

会出现内存泄露的问题

至于malloc,它并不知道你要开辟的空间是用来干什么用的,他只负责开辟内存和告诉你内存的地址而已,至于数组的大小,我们必须自己手动

添加。

********************************************************************************************************************************************************

三:不同的地方申请内存空间

new操作符从自由存储区(free store)上为对象动态分配内存空间,free store 和heap很相似,都是动态内存,但是所处的位置不同,而malloc是

在堆上动态分配内存,自由存储区是c++基于new的一个抽象概念,凡是通过new来申请的空间,这个空间就是自由存储区。而堆是操作系统所维护

护的一块特殊内存,使用free来释放申请的内存。

但是其实new也是可以在堆上分配内存的,这取决于operator new的实现细节,自由存储区不仅可以是堆,还可以是静态存储区,甚至可以不为对

象分配内存:

其实c++有四种new:(我只知道三种)

<1>普通new :void*operator new(std::size_t)throw(std::bad_alloc);//抛出bad_alloc异常

<2>不抛出异常new:void*operator new(std::size_t,const std::nothrow_t & )throw(); 

<3> 定位new: void*operator new(std::size_t,void *)//eg:A *q = new(p)A();//只构造对象,不分配内存。

*************************************************************************************************************

四:返回类型的安全性

对于new来说,调用成功时其返回值是对象类型的指针,类型是严格和对象进行匹配的,而malloc它的返回值是一个void*,需要通过强转才能成

为我们需要的类型,从类型安全方面考虑的话,new应该改会略胜一筹。

**************************************************************************************************************

五:失败时的返回值(我们只说普通类)

new内存分配失败时,会抛出bad_alloc异常,它不会返回NULL,而对于malloc而言,malloc失败时返回的是NULL。

**************************************************************************************************************

六:是否可以相互被调用

operator new 和operator delete 的实现基于malloc,而malloc不可以。

七:是否可以重载

operator new/operator delete 是可以被重载的,标准库定义了八个重载版本,而malloc/free是不允许重载的。

八:用户是否可以处理内存分配不足

在operator new抛出异常时以反映一个未获得满足的需求之前,他会先调用一个用户指定的错误处理函数,就是new-hander,它是一个指针类型:

new_hander set_new_hander(new_hander p)throw();

set_new_hander 的参数为new_hander指针,指向了operator new无法分配足够内存时应该调用的函数,其返回值也是一个指针,指向set_new_hander

被调用前正在执行的那个new_hander函数;而对于malloc,用户自己并不能够去编程决定内存不足以分配内存时应该做什么,只能等它返回NULL。

***********************************************************************************************************************************************************

九:分配内存大小

对于new来讲,它可以根据类型来自己计算出大小,而malloc必须手动指出,但是malloc内存不够可以调用void* realloc(void*p,size_t newsize)


***********************************************************************************************************************************************************

十:malloc和freesh是c++/c语言的标准库函数,而new和delete是c++的运算符,它们都可以用于申请动态开辟内存和释放内存。

十一:内存泄露对于malloc或者new都可以检验出来,但是区别是new可以指明是那个文件的哪一行,而malloc则不会大笑





原创粉丝点击