深入理解C++中的new/delete和malloc/free动态内存管理及区别介绍
malloc/free和new/delete的区别
- malloc/free是C/C++标准库的函数;new/delete是C++操作符。
- malloc/free只是动态分配内存空间/释放空间;new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理资源。
- malloc/free需要手动计算类型大小且返回值类型为void*;new/delete可自动计算类型的大小,返回对应类型的指针。
- malloc/free管理内存失败会返回0;new/delete等的方式管理内存失败会抛出异常。
在C++Primer书中有提到说:new/delete的表达式与标准库函数同名了,所以系统并没有重载new或delete表达式。new/delete真正的实现其实是依赖下面这几个内存管理接口的。
void*operatornew(size_t);//allocateanobject void*operatordelete(void*);//freeanobject void*operatornew[](size_t);//allocateanarray void*operatordelete[](void*);//freeanarray
malloc/free和new/delete的底层实现
new的底层实现
//new.cpp #include#include _C_LIB_DECL int__cdecl_callnewh(size_tsize)_THROW1(_STDbad_alloc); _END_C_LIB_DECL void*__CRTDECLoperatornew(size_tsize)_THROW1(_STDbad_alloc) {//trytoallocatesizebytes void*p; while((p=malloc(size))==0) if(_callnewh(size)==0) {//reportnomemory _THROW_NCEE(_XSTDbad_alloc,); } return(p); }
delete的底层实现
#include#include #include #include #include voidoperatordelete(void*p) { RTCCALLBACK(_RTC_Free_hook,(p,0)); free(p); }
new[]的底层实现
#includevoid*__CRTDECLoperatornew[](size_tcount)_THROW1(std::bad_alloc) { //trytoallocatecountbytesforanarray return(operatornew(count)); }
delete[]的底层实现
#ifdefCRTDLL #undefCRTDLL #endif #ifdefMRTDLL #undefMRTDLL #endif #define_USE_ANSI_CPP//suppressdefaultlibdirectiveforStdC++Lib #includeexternvoid__CRTDECLoperatordelete[](void*ptr)_THROW0(); void__CRTDECLoperatordelete[](void*ptr, conststd::nothrow_t&)_THROW0() { //freeanallocatedobject operatordelete[](ptr); }
malloc/free和new/delete的执行过程
new的执行过程
new(intsize)-->operatornew()-->malloc()-->constructorfunction-->returnptr
delete的执行过程
deleteptr-->destructorfunction-->operatordelete()-->free
new[]的执行过程
new[count]-->operatornew[]()-->operatornew()-->malloc()-->constructorfunction-->returnptr
delete[]的执行过程
delete[]ptr-->destructorfunction-->operatordelete[]()-->operatordelete()-->free
- 依次调用指针指向对象数组中每个对象的析构函数
- 调用operatordelete[](),operatordelete[]()再调用operatordelete
- 底层用free执行operatordelete表达式,依次释放内存
- operatordelete[]()数组的个数存放在指针的前4位
参考
https://www.nhooo.com/article/161885.htm
总结
到此这篇关于深入理解C++中的new/delete和malloc/free动态内存管理的文章就介绍到这了,更多相关C++中的new/delete和malloc/free动态内存管理内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。