C++之内存申请malloc/new的区别

malloc、new对象不同区别

malloc/free是C的库函数,new/delete是C++的运算符,都用于动态申请内存和释放内存;
第二,对于非内部数据类型的对象,对象在创建时要自动构造,销毁前要自动析构,这种情况只能用new/delete,因为malloc/free是库函数,不在编译器控制权限内,不能把构造和析构的任务强加到malloc/free上。

申请的内存所在位置不一样

new才佐夫是从自由存储区上为对象动态分配内存空间,而malloc是从堆上分配空间。自由存储区是C++基于new操作的一个抽象概念。凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊的内存,用于程序的内存动态分配。自由存储区不仅可以是堆,还可以是静态存储区,这都得看new在哪里为对象分配内存。

返回类型安全性

new分配成功时,返回对象类型的指针,类型于对象进行匹配,无须继续类型转换,故new是符合类型安全性的操作符。
而malloc内存分配是返回void* ,需要通过强制转换void* 指针转换构成我们所需要的类型。

内存分配失败的返回值

new失败是会抛出bac_alloc一场,他不会返回NULL
malloc分配失败时会返回NULL

是否需要指定内存大小

new无需指派需分配的大小,编译器会根据类型自动计算
malloc需要显示指派空间大小

是否调用构造/析构函数

new:

  1. 调用operator new操作符,分配一块足够大的空间,原始的,未命名的;
  2. 编译器运行相应的构造函数以构造对象,并为其传入初值;
  3. 对象构造完成后返回一个指向该对象的指针;
    delete:
  4. 调用对象析构;
  5. 调用delete

允许重载new,malloc不可以

分配内存扩充问题

malloc又realloc可以重新计算大小,new不行,new无法直接处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值