您的位置:首页 > 其它

malloc/free和new/delete的区别

2017-03-27 16:04 399 查看
相同点

都可用于申请动态内存和内存释放。

不同点

(1)操作对象不同,malloc/free是C++/C的标准函数库函数,new/delete是C++的运算符。对于非内部数据类的对象而言,光用malloc/free无法满足动态动态对象的要求,对象创建需要自动执行构造函数,对象消亡要自动执行析构函数。malloc/free是库函数而不是运算符,不在编译器控制前线之内,所以必须使用new/delete。

(2)申请的内存所在位置不同

new操作符从自由存储区上为对象动态分配内存,而malloc函数从堆是哪个动态分配内存。自由存储区不仅可以是堆,还可以是静态存储区。

(3)返回类型安全性

new操作符内存分配成功是,返回的是对象类型的指针,;类型严格与对象匹配,无须进行类型转变,new是符合拿权的操作符,而malloc内存分配成功这是返回void*,需要通过强制类型转换。

(4)内存分配失败时返回值

new分配内存失败时,排除bac_alloc异常,不会返回NULL,malloc分配失败时返回NULL。

C语言中
int *a=(int*)malloc(sizeof(int));
if(a==NULL)
{
}

C++
try
{
int* a=new int();
}catch(bad_alloc)
{}


(4)是否需要制定内存

使用new不需要在申请时制定内存大小,编译器会根据类型信息自行计算,而malloc则需要显示指出所需内存的大小。

class A{}
A *ptr=new A;
A *ptr=(A*)malloc(sizeof(A));


(5)是否可以被重载

operator new/delete可以被重载,标准库中有8个重载版本。

//这些版本可能抛出异常
void * operator new(size_t);
void * operator new[](size_t);
void * operator delete (void * )noexcept;
void * operator delete[](void *0)noexcept;
//这些版本承诺不抛出异常
void * operator new(size_t ,nothrow_t&) noexcept;
void * operator new[](size_t, nothrow_t& );
void * operator delete (void *,nothrow_t& )noexcept;
void * operator delete[](void *0,nothrow_t& )noexcept;


malloc/free则不允许重载。

(6)能够直观重新分配内存

使用malloc分配内存后,如果使用过程中发现内存不足,可以使用realloc函数进行内存重新分配实现内存的扩充。realloc先判断当前的指针所指内存是否有足够的连续空间,如果有,原地扩大可分配的内存地址,并且返回原来的指针地址,如果空间不够,先按照新制定的大小分配空间,将原有数据从头到尾拷贝到新份额皮的内存区域,而后释放原来的内存区域。

(7)客户处理内存不足

operator new抛出异常以反映一个未获得满足的需求之前,它会先调用一个用户指定的错误处理函数,这就是new_handler。

namespace std
{
typedef void (*new_handler)();
}


指向了一个无参数无返回值的函数,即为错误处理函数。为了指定错误处理函数,用户需要盗用set_new_handler

namespace std
{
new_handler set_new_handler(new_handler p) throw();
}


set_new_handler的参数为new_handler的指针,指向了operator new无法分配足骨内存时该调用的函数。其返回值也是个指针,指向了set_new_handler被调用前正在执行的那个new_handler函数。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: