1 new 写法
int *pi = new int; // 未初始化的对象
int *pi2 = new int(); // 值初始化的对象
vector<int> *pv = new vector<int>(100, 5); // 调用构造函数
vector<int> *pv2 = new vector<int>{ 1, 2, 3 }; // 初始化列表
- 用 new 分配 const 对象是合法的
- new 和 delete 通常成对出现
2 malloc 写法
int *pi = (int*)malloc(sizeof(int));
- malloc 和 free 通常成对出现
3 区别
- new 调用构造函数,malloc 不调用
- 申请成功返回类型:new 操作符申请内存成功时,返回的是对象类型的指针,类型严格与对象匹配,无需进行类型转换,因此 new 是类型安全性操作符。malloc 申请内存成功则返回
void*
,需要强制类型转换为我们所需的类型 - 申请失败:new 抛出类型为
std::bad_alloc
的异常,malloc 返回NULL
- new / delete 是 C++ 关键字,maollc 是库函数(
<stdlib.h>
) - new 在申请内存分配时不需要指定内存块大小,编译器会根据类型自动计算,malloc 需要显式指定内存大小
- 自定义类型:new 会先调 operator new 函数,申请足够的内存(底层也是 malloc 实现),然后调用类的构造函数,初始化成员变量,最后返回自定义类型指针。delete 先调用析构函数,然后调用 operator delete 函数来释放内存(底层是通过 free 实现)。 malloc / free 是库函数,只能动态申请和释放内存,无法强制要求其做自定义类型对象构造和析构函数
- 重载:允许重载 new / delete 操作符,特别地,布局 new 的就不需要为对象分配内存,而是指定了一个地址作为内存起始区域,new 在这段内存上为对象调用构造函数完成初始化工作,并返回地址。malloc 不允许重载。
参考:
- 【C++】new和malloc的区别
- 个人面经1:C++
- C++ Primer 中文版(第 5 版)