当前位置: 首页 > news >正文

【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++ 对象

#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. 总结

特性freedelete
来源C 语言C++
搭档malloc/calloc/reallocnew / new[]
是否调用析构函数❌ 不调用✅ 会调用
适用范围C 风格内存管理C++ 对象和数组
混用结果未定义行为未定义行为

记住一句口诀:
👉 C 的 malloc/free,C++ 的 new/delete,不要混用。

http://www.dtcms.com/a/336449.html

相关文章:

  • c++--文件头注释/doxygen
  • Linux应用软件编程---多任务(线程)(线程创建、消亡、回收、属性、与进程的区别、线程间通信、函数指针)
  • 工作八年记
  • 官方正版在线安装office 365安装工具
  • 数组的三种主要声明方式
  • 大模型对齐算法(二): TDPO(Token-level Direct Preference Optimization)
  • Android中使用Compose实现各种样式Dialog
  • tcp会无限次重传吗
  • Eclipse Tomcat Configuration
  • Portkey-AI gateway 的一次“假压缩头”翻车的完整排障记:由 httpx 解压异常引发的根因分析
  • 学习日志36 python
  • 力扣经典算法篇-52-零钱兑换(动态规划)
  • Java语法进阶之常用类
  • 【C2000】德州仪器C2000产品整体介绍
  • http工作流程
  • LangChain 多任务应用开发
  • matlab tlc的文件、字符串操作
  • Python @staticmethod 装饰器与 staticmethod() 函数
  • Tomcat Session Replication Cluster:实现高可用性和可扩展性的关键
  • 机试备考笔记 14/31
  • Ugit使用记录
  • Next.js跟React关系(Next.js是基于React库的全栈框架)(文件系统路由、服务端渲染SSR、静态生成SSG、增量静态再生ISR、API路由)
  • 提升 LLM 推理效率的秘密武器:LM Cache 架构与实践
  • Pandas初学者入门
  • C语言中回调函数的作用
  • 2025.8.11-2025.8.17第33周:完成第一次头马备稿演讲
  • 北京JAVA基础面试30天打卡12
  • 【URP】[法线贴图]为什么主要是蓝色的?
  • ZipList优缺点总结
  • leetcode_438 找到字符串中的所有异位词