C++程序员在口试的时候常常会被问new/delete和malloc/free的差异,这里
最明显的差异
new/delete是操作符,malloc/free是库函数,即malloc/free须要库的支持,new/delete不须要。
在C++中为了表示面向工具的思想,new不仅可以申请空间,还会去调用工具的布局函数,即new了一个工具出来,delete的时候会去调用工具的析构函数用来销毁工具;而C措辞中malloc/free是面向过程的,malloc的任务便是申请一片空间,free的任务便是将一块空间归还给操作系统。

在用法方面
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^