类型不同
new/delete是C++中的操作符,它调用的分别为赋值运算符重载operator new()和operator delete();
void *operator new(size_t); //allocate an object
void *operator delete(void *); //free an object
void *operator new[](size_t); //allocate an array
void *operator delete[](void *); //free an array
而malloc和free是标准库函数,需要头文件stdlib.h支持。
void* malloc(size_t size)//参数代表字节个数
void free(void* pointer)//参数代表内存地址
事实上,new/delete底层是基于malloc/free来实现的
功能上
都是分配和释放内存空间,但new在为对象分配内存空间时,可以自动调用构造函数,delete也可以自动调用析构函数。而malloc和free只是为变量分配和释放内存。
使用上
-
malloc的返回值为void * (无类型指针,可以指向任意类型的数据),必须强制类型转换为对应的类型指针,而new是直接返回对应类型的指针
-
malloc本身并不知道申请的内存是什么类型,它只关心内存的总字节数,所以需要先使用sizeof计算需要分配的内存空间大小,这也是为什么需要强制转换的原因。而new是由编译器自己计算。
-
new 可以在分配内存的同时赋初值。
-
new、delete和new[]、delete[]必须配对使用
-
malloc开辟内存时返回内存地址要判空,因为若内存开辟失败,则会返回空指针NULL;而new不用判断,因为内存分配失败时,它会抛出bac_alloc异常,可以使用异常处理机制。
-
无论释放几个空间大小,free只传递指针,多个对象时delete需加[]
-
对于malloc分配内存后,若在使用过程中内存分配不够或太多,这时可以使用realloc函数对其进行扩充或缩小,但是new分配好的内存不能这样被直观简单的改变;
int *a = (int *) malloc(sizeof(int));
int *b = new int;
int *c = new int(666);