C++中malloc、free和new、delete的区别
malloc、free和new、delete的区别
基本概念
malloc、free
malloc、free是c语言中的库函数
void* malloc(long num_bytes); void free(void *first_byte);
内存操作
malloc函数接收需要分配的内存字节数,如果内存足够,可以成功分配,会返回指向内存块起始位置的指针
free函数释放指针指向的内存,接收的参数是需要释放的内存的首地址
用法
malloc:
- malloc返回的是void*类型的指针,需要手动转换成指定类型的指针;
- malloc本身并不是别要申请的内存是什么类型,他只关心申请的内存的字节数
Type *ptr = (Type *)malloc(sizeof(Type) * length);free:
free(ptr);
实际上,在调用malloc之后,返回给用户的指针指向的地址的前面还有一段元数据,这部分元数据记录了内存块的大小等数据
内存布局大概是这样的:| 元数据(记录大小等信息) | 用户数据区(malloc返回的指针) | ^ ^ | | 系统知道的块起始地址 malloc返回的p元数据的大小是固定的,所以在调用free函数的时候会先找到这部分元数据,获得内存块大小之后再执行释放内存
new、delete
new和delete是c++中的操作符
new在被调用的时候首先会申请内存,然后执行构造函数构造对象
delete在被调用的时候首先执行析构函数析构对象,然后才是释放内存
用法
- new可以自动计算要分配的内存大小,只需要传给new对象类型和数量,因为new内置了sizeof、类型转换和类型安全检查等功能;
- 要构造一个对象就
new Type,构造多个就new Type[num];- delete释放一个对象就
delete obj,delete释放一个数组就delete []array
区别
- malloc、free是c语言的库函数,而new、delete是c++的操作符(操作符可以重载)
- new自动计算所需分配内存,malloc需要手动计算
- new返回的是对象类型的指针,malloc返回void*,需要类型转换成对象类型
- delete释放内存时需要对象类型的指针,free是void*类型的指针
- new分配失败会抛出异常,malloc分配失败返回NULL空指针;这是基于c和c++语言的区别
- new在free store上分配内存,malloc在堆上分配
这里free store指的是,new是c++的运算符,运算符可以重载,所以对于new的实现,可以是调用malloc在堆上申请内存,也可能是定向到一块已经申请好的静态全局内存上- new先调用operator new进行内存申请,然后调用构造函数初始化成员变量,最后返回指针
delete先调用析构函数,在调用operator delete释放内存
c++的类对象,既需要申请内存,还需要初始化操作,释放时也需要析构和释放内存两步,所以才有了new和delete- new是类型安全的,而malloc不是
int *p = new float[5];编译时会报错
int *p = malloc(5 * sizeof(float));编译时不报错
