new和malloc的区别

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容