malloc和new的十一个区别

本文对比了C++中new/delete操作符与C/C++中malloc/free函数的区别,包括它们在内存分配的位置、安全性、构造与析构函数的调用、相互调用情况、数组处理方式、内存分配失败的处理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 属性
1 new/delete是c++操作符
2 malloc/free是c/c++标准的库函数

二 申请内存所在位置
1 new:自由存储区:自由存储区是c++基于new操作符的一个抽象概念。通过new申请的内存都称为自由存储区,自由存储区可以为堆,也可以为静态存储区(取决于operator new()在哪里为对象分配内存)。
2 malloc:堆:堆是操作系统的术语,是系统维护的一块特殊的区域,用于动态内存分配。

三 返回值类型安全性
1 new:返回一个指定数据类型的指针,无需进行转换。安全
2 malloc:malloc返回一个void*的指针,需要强制转换为我们需要的类型。不安全

四 是否调用构造析构函数
1 new:new开辟空间的时候会调用构造函数,delete释放空间的时候调用析构函数
2 malloc:malloc开辟空间的时候不调用构造函数,free释放空间的时候不调用析构函数

五 是否存在相互调用情况
1 new:当new用于开辟类空间的时候,new先调用operator new()函数(该函数并不是new的重载),而该函数就是malloc的一层封装。然后调用构造函数对对象进行初始化。
delete释放空间的时候先调用析构函数对成员进行清理,然后调用operator delete()进行释放空间,而该函数是free的一层封装。
2 malloc:malloc不能调用new

六 是否有对于数组类型的特别的处理
1 new:我们知道new[]/delete[]就是用于开辟一段连续的空间和释放一段连续的空间的。
new[]和new的操作不同,它先会调用operator new[]()函数,然后调用operator new()开辟出一块给定大小加4个字节的空间(多出来的四个字节在开头,用于记录调用析构函数的次数),最后调用N次构造函数,对其进行初始化(如果开辟的是类空间的话)。
delete[]和delete的操作也不同,它先会调用N次析构函数对成员进行清理,然后调用operator delete[](),调用operator delete()。
2 malloc:并没有针对数组的特别操作

七 内存分配失败败时的返回值
1 new:new失败时是抛出bac_alloc异常,而不是返回一个NULL。所以对其返回值作if(NULL==pointer)的判断是没有用的。如果new开辟失败,抛出异常,然后直接跳过new后面的代码。正确的做法是捕捉异常:

try {
      int* p = new int[SIZE];
            // 其它代码
    } 
    catch ( const bad_alloc& e )
     {
            return -1;
     }

2 malloc:内存分配失败时返回一个NULL指针

八 是否需要指定开辟内存大小
1 new:编译器会根据类型信息自行计算
2 malloc:需要认为指定开辟空间的大小

九 是否可以被重载
1 new:new允许被重载,标准库定义了new的八个重载版本
2 malloc:不允许

十 是否能够直观地分配内存
1 new:不能
2 malloc:在分配的内存空间不足时,可以调用realloc函数进行扩充。

十一 客户处理内存分配不足
1 new :客户可以通过制定处理函数和重新制定分配器的方式来处理内存分配不足的情况
2 malloc:malloc无法处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值