new和malloc的区别

1、属性
new/delete 是关键字
malloc/free是库函数

2、参数(是否需要指定内存大小)
new动态申请内存时,不需要指定内存块的大小
int *p = new int;
mallo动态申请内存时,需要显示指定内存的大小
int *p = (int*)malloc(sizeof(int));

3、返回值(返回类型安全性)
new内存分配成功时,返回的是对象类型的指针,是符合类型安全的操作符
mallo内存分配成功时,返回void*,需要通过强制类型转换成所需要的类型

4、分配内存失败
new内存分配失败时,会抛出bad_alloc异常
malloc内存分配失败时,会返回NULL

5、是否调用构造函数/析构函数
new会先调用void* operator new(size_t size)函数(底层是malloc实现的),
然后会调用类型的构造函数,初始化成员变量

delete先调用析构函数,然后调用void operator delete(void* ptr)函数
(底层是free实现的)来释放内存

6、对数组的处理
int* p1 = new int;
delete p1;

int *p2 = new int[4];
delete []p2;

int* p1 = (int*)malloc(sizeof(int));
free(p1);

int *p2 = (int*)malloc(sizeof(int)*4);
free(p2);

释放内存时,无论内存块的大小多大,free只需要传指针
而delete在释放多个对象时,需要加[]

7、new与malloc是否相互调用
new调用operator new函数,operator new底层调用malloc

8、是否可以被重载
C++允许重载new/delete操作符,而malloc不允许

9、分配的内存区域
C++中,将内存区分为:堆、栈、自由存储区、全局/静态存储区、常量存储区
new是从自由存储区(free store)上为对象动态分配内存空间
自由存储区是C++中基于new操作符的一个抽象的概念

malloc申请是从堆上分配内存,堆是操作系统中所维护的一块特殊内存

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值