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。
(4)是否需要制定内存
使用new不需要在申请时制定内存大小,编译器会根据类型信息自行计算,而malloc则需要显示指出所需内存的大小。
(5)是否可以被重载
operator new/delete可以被重载,标准库中有8个重载版本。
malloc/free则不允许重载。
(6)能够直观重新分配内存
使用malloc分配内存后,如果使用过程中发现内存不足,可以使用realloc函数进行内存重新分配实现内存的扩充。realloc先判断当前的指针所指内存是否有足够的连续空间,如果有,原地扩大可分配的内存地址,并且返回原来的指针地址,如果空间不够,先按照新制定的大小分配空间,将原有数据从头到尾拷贝到新份额皮的内存区域,而后释放原来的内存区域。
(7)客户处理内存不足
operator new抛出异常以反映一个未获得满足的需求之前,它会先调用一个用户指定的错误处理函数,这就是new_handler。
指向了一个无参数无返回值的函数,即为错误处理函数。为了指定错误处理函数,用户需要盗用set_new_handler
set_new_handler的参数为new_handler的指针,指向了operator new无法分配足骨内存时该调用的函数。其返回值也是个指针,指向了set_new_handler被调用前正在执行的那个new_handler函数。
都可用于申请动态内存和内存释放。
不同点
(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函数。
相关文章推荐
- malloc/free和new/delete的区别
- malloc/free和new/delete的区别
- new/delete和malloc/free的区别
- new/delete和malloc/free的区别-zz
- c++中的malloc/free 和 new/delete这两对的区别
- malloc/free 与 new/delete 的区别
- new/delete和malloc/free的区别
- malloc/free和new/delete用法和区别
- malloc与free和new/delete的区别
- malloc/free和new/delete的区别
- malloc/free 和 new/delete 的区别
- malloc/free 与new/delete 的区别
- new/delete和malloc/free的区别
- new/delete和malloc/free的区别
- malloc/free 与 new/delete 的区别
- malloc/free,new/delete区别与联系
- new/delete和malloc/free的区别和联系
- malloc()/free()和new/delete的区别
- malloc/free和new/delete的区别
- malloc/free和new/delete的区别