【C++】new 和 malloc 的区别

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 区别

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

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值