【C++知识杂记2】free和delete区别

好问题 👍,这个是 C 和 C++ 动态内存管理 的核心区别之一。

我帮你从几个方面梳理一下 freedelete 的差别:


1. 出身背景不同

  • free 来自 C 语言 ,对应 malloc/calloc/realloc
  • delete 来自 C++ ,对应 new

2. 是否调用析构函数

这是最关键的区别:

  • free

    • 只会 释放内存,不会调用对象的析构函数
    • 如果对象里有资源(比如文件句柄、动态数组等),这些不会被正确释放
    • 适用于 C 风格的 malloc 分配的内存
  • delete

    • 会先调用对象的 析构函数,再释放内存
    • 所以适用于 new 创建的对象(尤其是类对象)

3. 使用规则

  • 必须配对使用

    • mallocfree
    • newdelete
    • new[]delete[]

👉 如果混用,比如 mallocdelete,或者 newfree,会导致 未定义行为(程序崩溃或内存泄漏)。


4. 示例代码

错误示例:用 free 销毁 C++ 对象

cpp 复制代码
#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

cpp 复制代码
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,不要混用。

相关推荐
wanghanjiett34 分钟前
笔记:ESP32驱动SimpleFOC成功(基于Espressif-IDE)
笔记·esp32·foc
莫等闲-44 分钟前
代码随想录一刷记录Day44——leetcode1143.最长公共子序列 53. 最大子序和
数据结构·c++·算法·leetcode·动态规划
不灭锦鲤44 分钟前
网络安全学习第101天
学习
承渊政道1 小时前
【动态规划算法】(背包问题经典模型与解题套路)
数据结构·c++·学习·算法·leetcode·动态规划·哈希算法
weixin_421725261 小时前
2026年C/C++/C#全解析:底层语言的进化与场景抉择,选错直接掉队
c语言·c++·c·编程语言·技术选择
大邳草民1 小时前
Python 爬虫:从 HTTP 请求到接口分析
笔记·爬虫·python
南湖渔歌1 小时前
【成功实践版】workbuddy_把多张图片转成完整Markdown笔记
人工智能·笔记·workbuddy
我头发多我先学1 小时前
C++ 红黑树:从规则到实现,手把手带你写一棵红黑树
数据结构·c++·算法
遗憾随她而去.1 小时前
Java学习(一)
java·开发语言·学习
lzh200409191 小时前
深入学习Linux进程间通信:解析消息队列
linux·c++