delete和free的区别

1. 对象类型

delete是C++语言自带的运算符,对于类对象进行删除时调用类的析构函数。

free是C标准库函数,仅释放空间,不会释放一个类(或者结构体)对象的空间。

2. 内存碎片

delete在释放内存后,能够确保内存内容被释放,并合并成一块可用的空间。在大规模内存管理、长时间运行时程序表现更为优秀。

free只是简单地将内存地址修改为空闲状态,并不能保证合并成一块可用的空间。如果频繁地执行 malloc 和 free,容易产生大量小块内存碎片,从而导致不利于程序运行效率的问题。

  1. 参数类型

delete都是以指针为参数,delete只能释放new分配的空间

free是以地址值为参数,free只能释放malloc分配的空间

4. 行为保证

delete具有行为保证(即无论是否出错都会表现一致),能够确保释放内存不会对其他对象造成影响。

free不具备任何行为保证,释放后的地址空间中仍可能存在原来数据的残留物,甚至可能覆盖其他已经被释放的对象。

MyClass *obj = nullptr;
try {
    obj = new MyClass[10];
}
catch (std::bad_alloc& e) {
    std::cerr << "allocation failed: " << e.what() << '\n';
    return -1;
}
/* 如果在数组中的某个元素上的 new 分配抛出异常,则不能提供任何行为保证,此时 delete 存在未定义的行为*/
delete[] obj;
int *p = (int*)malloc(10 * sizeof(int));
free(p + 5);   /*释放后还有可能存在残留的数据,对于这种操作 free 不会给出任何警告或错误提示*/

重载与自定义

new/delete

允许全局或类特定的重载,支持自定义内存管理策略(如内存池)。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值