【C++知识杂记2】free和delete区别
好问题 👍,这个是 C 和 C++ 动态内存管理 的核心区别之一。
我帮你从几个方面梳理一下 free
和 delete
的差别:
1. 出身背景不同
free
来自 C 语言,对应malloc
/calloc
/realloc
delete
来自 C++,对应new
2. 是否调用析构函数
这是最关键的区别:
-
free
- 只会 释放内存,不会调用对象的析构函数
- 如果对象里有资源(比如文件句柄、动态数组等),这些不会被正确释放
- 适用于 C 风格的
malloc
分配的内存
-
delete
- 会先调用对象的 析构函数,再释放内存
- 所以适用于
new
创建的对象(尤其是类对象)
3. 使用规则
-
必须配对使用:
malloc
→free
new
→delete
new[]
→delete[]
👉 如果混用,比如 malloc
配 delete
,或者 new
配 free
,会导致 未定义行为(程序崩溃或内存泄漏)。
4. 示例代码
错误示例:用 free
销毁 C++ 对象
#include <iostream>
using namespace std;struct Foo {Foo() { cout << "Foo constructed\n"; }~Foo() { cout << "Foo destroyed\n"; }
};int main() {Foo* p = new Foo;free(p); // ❌ 释放内存,但不会调用 ~Foo()
}
输出:
Foo constructed
析构函数没执行,造成资源泄漏。
正确示例:用 delete
Foo* p = new Foo;
delete p; // ✅ 调用 ~Foo(),再释放内存
输出:
Foo constructed
Foo destroyed
5. 总结
特性 | free | delete |
---|---|---|
来源 | C 语言 | C++ |
搭档 | malloc/calloc/realloc | new / new[] |
是否调用析构函数 | ❌ 不调用 | ✅ 会调用 |
适用范围 | C 风格内存管理 | C++ 对象和数组 |
混用结果 | 未定义行为 | 未定义行为 |
记住一句口诀:
👉 C 的 malloc/free
,C++ 的 new/delete
,不要混用。