1. 对象类型
delete是C++语言自带的运算符,对于类对象进行删除时调用类的析构函数。
free是C标准库函数,仅释放空间,不会释放一个类(或者结构体)对象的空间。
2. 内存碎片
delete在释放内存后,能够确保内存内容被释放,并合并成一块可用的空间。在大规模内存管理、长时间运行时程序表现更为优秀。
free只是简单地将内存地址修改为空闲状态,并不能保证合并成一块可用的空间。如果频繁地执行 malloc 和 free,容易产生大量小块内存碎片,从而导致不利于程序运行效率的问题。
- 参数类型
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
允许全局或类特定的重载,支持自定义内存管理策略(如内存池)。
1180

被折叠的 条评论
为什么被折叠?



