C++中new/delete和malloc/free的区别和联系

类型不同

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只是为变量分配和释放内存。

使用上

  1. malloc的返回值为void * (无类型指针,可以指向任意类型的数据),必须强制类型转换为对应的类型指针,而new是直接返回对应类型的指针

  2. malloc本身并不知道申请的内存是什么类型,它只关心内存的总字节数,所以需要先使用sizeof计算需要分配的内存空间大小,这也是为什么需要强制转换的原因。而new是由编译器自己计算。

  3. new 可以在分配内存的同时赋初值。

  4. new、delete和new[]、delete[]必须配对使用

  5. malloc开辟内存时返回内存地址要判空,因为若内存开辟失败,则会返回空指针NULL;而new不用判断,因为内存分配失败时,它会抛出bac_alloc异常,可以使用异常处理机制。

  6. 无论释放几个空间大小,free只传递指针,多个对象时delete需加[]

  7. 对于malloc分配内存后,若在使用过程中内存分配不够或太多,这时可以使用realloc函数对其进行扩充或缩小,但是new分配好的内存不能这样被直观简单的改变;

int *a = (int *) malloc(sizeof(int));
int *b = new int;
int *c = new int(666);

在这里插入图片描述
C++中new/delete和malloc/free的区别和联系_第1张图片

你可能感兴趣的:(CPP,内存管理,malloc,c++)