首页 » PHP教程 » phpnewobjectdelete技巧_动态内存治理newdelete和mallocfree

phpnewobjectdelete技巧_动态内存治理newdelete和mallocfree

访客 2024-12-06 0

扫一扫用手机浏览

文章目录 [+]

C++程序员在口试的时候常常会被问new/delete和malloc/free的差异,这里

最明显的差异

new/delete是操作符,malloc/free是库函数,即malloc/free须要库的支持,new/delete不须要。

phpnewobjectdelete技巧_动态内存治理newdelete和mallocfree

在C++中为了表示面向工具的思想,new不仅可以申请空间,还会去调用工具的布局函数,即new了一个工具出来,delete的时候会去调用工具的析构函数用来销毁工具;而C措辞中malloc/free是面向过程的,malloc的任务便是申请一片空间,free的任务便是将一块空间归还给操作系统。

phpnewobjectdelete技巧_动态内存治理newdelete和mallocfree
(图片来自网络侵删)

在用法方面

malloc的函数原型是

void malloc ( size_t size );

new的用法

obj object = new obj();

malloc传入参数是申请字节数,new的参数是工具布局函数的参数;malloc的返回值是void,malloc函数不知道自己申请的空间拿来干什么,以是我们利用的时候须要进行逼迫类型转换;而new的返回值是工具指针,明确的指明了这个返回值的类型。

free的函数原型

void free ( void ptr );

delete的用法

delete ptr;

free能够精准的开释掉malloc的空间,但是只能开释一次,如果ptr为空指针则可以开释多次,ptr为野指针则会使程序崩溃。
delete在开释空间的时候回去调用析构函数,然后就和free一样了。

在利用方面

如果malloc失落败了会返回空指针,以是在利用的时候须要判断申请的空间是否为空,而new失落败了会抛出非常;malloc须要手动打算申请空间大小,new只传入所须要的工具数即可;new在申请工具数组的时候只能够调用无参的布局函数;在一块malloc的空间上我们可以利用new的定位表达式去显示的调用布局函数初始化工具,这个也是STL里面的空间适配器的实现的方法。

实质

在底层new函数的重载函数里面利用的是malloc开辟一块空间,在调用工具的布局函数,如果申请失落败,malloc函数返回空,则new的重载函数会调用set_new_handler句柄函数,开释部分内存,再进行申请空间,达到一定的时候程序就会抛出非常;在底层delete函数先调用工具的析构函数,再将整块空间利用free开释掉。
从实质上讲new/delete里面调用了malloc/free。

两者在利用的时候只管即便不要串了,即用malloc申请的空间用delete去开释,虽然说这种情形是可以的但是为了保持程序的可读性和可掩护性,只管即便按照规则来用,不然会故意想不到的事情发生。

结束语:

如果喜好这篇头条,一定要收藏哟^O^

点击关注,理解更多关于编程的知识^O^

如果有不懂的地方,可以留言,相互磋商,相互学习,共同进步^O^

标签:

相关文章

php反向署理iis技巧_IIS实现反向代理

反向代理可以启用高等URL策略和管理技能,从而使处于不同web做事器系统的web页面同时存在于同一个URL空间下。通过IIS安装反...

PHP教程 2024-12-08 阅读0 评论0