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则不会