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

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

`free``delete`都是用于释放动态分配的内存,但它们存在诸多区别: ### 所属类别 `free`是C/C++标准库的函数,而`delete`是C++中的操作符[^1]。 ### 与分配函数的匹配 `free`用于释放由`malloc`分配的动态内存,而`delete`用于释放由`new`分配的动态内存空间。`delete[]`专门用于释放由`new[]`分配的数组内存,例如: ```cpp #include <iostream> #include <cstdlib> int main() { // 使用malloc分配内存 int* p1 = (int*)malloc(10 * sizeof(int)); free(p1); // 使用new分配内存 int* p2 = new int(10); delete p2; // 使用new[]分配数组内存 int* p3 = new int[10]; delete[] p3; return 0; } ``` ### 构造与析构函数调用 `malloc/free`仅负责分配释放内存,不会调用对象的构造函数析构函数。而`new/delete`除了分配释放内存外,还会调用对象的构造函数析构函数进行初始化清理工作[^1]。 ```cpp #include <iostream> class MyClass { public: MyClass() { std::cout << "Constructor called" << std::endl; } ~MyClass() { std::cout << "Destructor called" << std::endl; } }; int main() { // 使用newdelete MyClass* obj1 = new MyClass(); delete obj1; // 使用mallocfree MyClass* obj2 = (MyClass*)malloc(sizeof(MyClass)); free(obj2); return 0; } ``` 运行上述代码,使用`new``delete`时会调用构造函数析构函数,而使用`malloc``free`时则不会。 ### 内存大小计算 `malloc`需要手动计算所需内存的大小,并且返回的是`void*`类型的指针,通常需要进行显式类型转换。`new`则可以自动计算类型的大小,并返回对应类型的指针[^1]。 ```cpp #include <cstdlib> int main() { // 使用malloc int* p1 = (int*)malloc(10 * sizeof(int)); // 使用new int* p2 = new int[10]; return 0; } ``` ### 数组处理 使用`malloc`分配数组内存时,释放内存直接使用`free`即可。而使用`new`分配数组内存时,释放内存需要使用`delete[]`,如果使用`delete`则只会释放数组的第一个元素,其余元素的内存不会被释放[^3]。 ```cpp #include <iostream> #include <cstdlib> int main() { // 使用malloc分配数组内存 int* p1 = (int*)malloc(100 * sizeof(int)); free(p1); // 使用new分配数组内存 int* p2 = new int[100]; delete[] p2; return 0; } ``` ### 行为保证 `free`不具备任何行为保证,释放后的地址空间中仍可能存在原来数据的残留物,甚至可能覆盖其他已经被释放的对象,并且对于一些不规范的操作,`free`不会给出任何警告或错误提示。`delete`在正常情况下会正确释放内存并调用析构函数,但如果在数组中的某个元素上的`new`分配抛出异常,则不能提供任何行为保证,此时`delete`存在未定义的行为[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值