美文网首页C++基础知识
new和malloc的区别

new和malloc的区别

作者: 安然_fc00 | 来源:发表于2017-03-20 23:18 被阅读17次

new和malloc都用于动态申请内存

  1. 从本质上来说,malloc是C中的函数,需要声明特定的头文件。而new是C++中的关键字(操作符),它本身不是函数,所以不依赖于头文件,C++译器就可以把new编译成目标代码(还会根据参数的类型插入相应的构造函数)。
  2. 从使用上来说,如下几点不同:
    • new和delete是操作符,可以重载,只能在C++中使用。而malloc,free是函数,可以覆盖,C、C++中都可以使用。

    • new可以自动计算所需要的字节大小。而malloc必须人为的计算出所需要的字节数。在Linux中可以有这样:malloc(0),这是因为Linux中malloc有一个下限值16Bytes,注意malloc(-1)是禁止的,但是在某些系统中是不允许malloc(0)的。

    • 分配内存成功的话,new返回指定类型的指针。而malloc返回void指针,可以在返回后强行转换为实际类型的指针。对于C++,如果写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。而对于C,没有这个要求,但为了使C程序更方便的移植到C++中来,建议养成强制转换的习惯。

    • 分配内存失败时,new会throw一个异常std::bad_alloc。而malloc会返回空指针。

    • new可以调用对象的构造函数,对应的delete调用相应的析构函数。而malloc仅仅分配内存,free仅仅回收内存,并不执行构造函数和析构函数。

在规范的程序中我们有必要按照这样的格式去使用malloc及free:

type *p;
if(NULL == (p = (type*)malloc(sizeof(type))))/*请使用if来判断,这是有必要的*/
{    
     perror(error...);
     exit(1);
}
/*其它代码*/
free(p);
p = NULL;/*请加上这句*/

malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小。比如想分配100个int类型的空间:

int *p = (int*)malloc(sizeof(int) * 100);//分配可以放得下100个整数的内存空间。

另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。
对其做一个特例补充

char *ptr;
if((ptr = (char*)malloc(0)) == NULL)    puts(Got an null pointer);
else     puts(Got a valid pointer);

此时得到的是Got a valid pointer。把0赋给malloc能得到一个合法的指针。

new/delete和malloc/free的效率比较:

1.new/delete的实现其实是调用了malloc/free的。
2.不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete,因为new/delete会自动调用构造析构函数。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。
3.既然new/delete的功能完全覆盖了malloc/free,为什么C++不malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。

参考文章:

https://zhidao.baidu.com/question/1370118115766445699.html?fr=iks&word=new%BA%CDmalloc%B6%BC%C4%DC%B4%B4%BD%A8%D0%C2%B5%C4%B6%D4%CF%F3%2C%C7%F8%B1%F0%D4%DA%C4%C4%2C%C4%C4%B8%F6%D0%A7%C2%CA%B8%FC%B8%DF&ie=gbk

相关文章

  • new和malloc的区别

    new和malloc的区别

  • malloc和new的区别

    1 malloc函数 malloc的全称是memory allocation,中文叫做:动态内存分配。 原型:ex...

  • new和malloc的区别

    new和malloc都用于动态申请内存 从本质上来说,malloc是C中的函数,需要声明特定的头文件。而new是C...

  • malloc和new的区别

    1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态...

  • new和malloc的区别

    https://www.cnblogs.com/QG-whz/p/5140930.html

  • malloc和new的区别

    C语言中的malloc/free和C++中的new/delete的区别和联系 相同点:它们都是对内存进行管理 区别...

  • malloc和New的区别

    1、malloc/free是c中的一个函数,new/delet是c++中的操作符,都是动态分配内存 2、void ...

  • C++基础复习与总结

    一、new和malloc的区别1、new和delete配对,释放数组需要用delete[]。new和delete实...

  • 虚幻 Unreal Engine 4内存管理

    不受内存管理的内存 malloc & free new & deletenew与malloc的区别在于,new在分...

  • 大厂C++面试题要点

    1、malloc和new的区别 (1)操作对象不同:malloc/free是C++/C语言的标准库函数,new/d...

网友评论

    本文标题:new和malloc的区别

    本文链接:https://www.haomeiwen.com/subject/gwtwnttx.html