new和malloc都用于动态申请内存
- 从本质上来说,malloc是C中的函数,需要声明特定的头文件。而new是C++中的关键字(操作符),它本身不是函数,所以不依赖于头文件,C++译器就可以把new编译成目标代码(还会根据参数的类型插入相应的构造函数)。
-
从使用上来说,如下几点不同:
-
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也一样。
网友评论