C语言中的newdelete与C++中的mallocfree 的区别?

    科技2022-08-07  98

    new/delete 与 malloc/free 的区别是什么?

    malloc 与 free 是C++/C的标准库函数,new / delete 是C++的运算符,它们都可用于申请动态内存和释放内存。

    对于非内部数据类型的对象而言,只用 malloc / free 无法满足动态对象的要求。对象在创建的同时,要自动执行构造函数,对象在消亡之前要自动执行析构函数。而由于 malloc / free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于 malloc / free

    malloc 开辟空间的大小需自己计算,new 是编译器计算。

    malloc 返回指针是 void,需要强制转换为对应类型的指针。new 直接返回对应类型指针。

    new / delete 与 malloc / free申请内存位置说明,malloc 我们知道它是在堆上分配内存的,但 new 其实不能说是在堆上,C++中,对 new 申请内存位置有一个抽象概念,它为自由存储区,它可以在堆上,也可以在静态存储区上分配,这主要取决于 operator new 实现细节,取决与它在哪里为对象分配空间。

    new / delete 是c++中的保留字,不需要头文件,相反,macoll / free 在c语言中,需要头文件的支持

    new / delete 可以执行构造函数,而 macoll 却不可以执行

    new / delete 可以自动判断字节大小,macoll 必须自己指定大小;

    macoll 的返回值是void*,因此在使用的时候必须进行强类型转换,比如说使用 macoll 申请一个 int 类型的空间就需要:(int*)macoll(sizeodf(int)),而在 new 中,则不需要这些东西;

    安全问题:new 是安全的,会自己检测指针是否已经初始化,而 macoll 不会进行这样的判断

    返回值问题:macoll 的返回值,如果申请成功 就会返回已经申请的内存地址,若申请失败,将会返回空指针:NULL 在 new 中,若申请失败,还可以发出异常

    对象方面:delete 会自己析构函数,但是 free 却不能完成。 new 在为对象申请时,可以自己执行构造函数,macoll却不能,如果是用户自定义的对象, macoll 不行去申请地址。

    结论:相比之下,new / delete 更像是 macoll / free 的增强版,但是消耗的的系统资源也会更多

    Processed: 0.009, SQL: 8