C++ 中 free 和 delete 的区别

2025 年 8 月 29 日 | 6 分钟阅读

在 C++ 中,free() 函数和 delete 运算符都主要用于释放动态分配的内存。两者功能相似,但在多个方面存在差异,例如来源、用法、行为、类型安全等。

本文将讨论 C++ 中 free() 函数和 delete 运算符之间的区别。在讨论它们的区别之前,我们必须了解 C++ 中的 free 和 delete。

什么是 free() 函数?

C++ 中,free() 函数用于动态释放内存。它基本上是一个主要用于 C++ 的库函数,定义在 stdlib.h 头文件中。当指针指向使用 malloc() 函数分配的内存或 NULL 指针时,使用此库函数。

语法

它具有以下语法:

在这个语法中,

  • ptr_name: 它表示指针的名称。
  • 返回值: free() 函数不返回任何值。它的主要功能是释放内存。

带有 Malloc 的 C++ Free 函数示例

让我们举一个例子来说明 C++ 中带有 malloc 的 free 函数。

示例

编译并运行

输出

Enter 5 integer
4
6
2
5
7

User entered value
4 6 2 5 7 Garbage Value
286744300 6 -753986992 -288116722 7

说明

在此示例中,我们演示了 free() 函数如何与 malloc() 函数配合使用。首先,我们声明整数指针 *ptr,然后使用 malloc() 函数为此指针变量分配内存。之后,ptr 指向一个未初始化的 5 个整数的内存块。分配内存后,我们使用 free() 函数销毁此已分配的内存。当我们尝试打印 ptr 指向的值时,我们得到一个垃圾值,这意味着内存已被释放。

带有 Calloc 的 C++ Free 函数示例

让我们举一个例子来说明 C++ 中带有 Calloc 的 free 函数。

示例

编译并运行

输出

The value of *ptr before applying the free() function : 6.7
The value of *ptr after applying the free() function : 8.13715e-37

说明

在此示例中,我们可以观察到 free() 函数与 calloc() 函数配合使用。我们使用 calloc() 函数为浮点指针 ptr 分配内存块。之后,我们为 ptr 分配了一个内存块,它可以包含一个浮点类型的值。

什么是 Delete 运算符?

delete 是 C++ 编程语言中使用的一个运算符,它用于动态释放内存。此运算符主要用于使用 new 运算符分配或为 NULL 指针的指针。

语法

它具有以下语法:

如果要删除已分配的内存块,可以使用以下语法

要删除数组,我们使用如下所示的语句

关于 Delete 运算符的重要提示

与 delete 运算符相关的一些重要点如下

  • 它用于删除使用 new 关键字分配的数组或非数组对象。
  • 我们使用 delete[] 和 delete 运算符来删除数组或非数组对象。
  • new 关键字在堆中分配内存;因此,我们可以说 delete 运算符总是从堆中释放内存。
  • 它不销毁指针,而是销毁指针指向的值或内存块。

C++ Delete 运算符示例

让我们通过一个示例来说明 C++ 中的 delete 操作符。

示例

编译并运行

输出

The value of p is : 68
The value after delete is : -1692301068

说明

在此示例中,我们使用 new 运算符分配内存,因此我们使用 delete ptr 运算符销毁指针 ptr 指向的内存块。

free() 和 Delete 之间的主要区别

C++ 中 delete 和 free() 之间存在一些区别。free() 和 delete 之间的一些主要区别如下

  • delete 是一个动态释放内存的运算符。另一方面,free() 是一个在运行时销毁内存的函数。
  • delete 运算符用于删除使用 new 运算符分配或为 NULL 指针的指针。另一方面,free() 函数用于删除使用 malloc()、calloc() 和 realloc() 函数分配或为 NULL 指针的指针。
  • 当 delete 运算符销毁已分配的内存时,它会调用 C++ 中类的析构函数。另一方面,free() 函数不调用析构函数;它只从堆中释放内存。
  • delete 运算符比 free() 函数快。
  • delete 运算符释放已分配的内存并调用析构函数。另一方面,free() 函数释放内存,但不调用析构函数。

free 和 delete 运算符的表格形式区别

C++ 中 delete 和 free() 之间存在一些区别。free() 和 delete 的一些主要区别(表格形式)如下

特点免费删除
类型它是一个库函数。它是一个操作符。
内存释放它应该只用于释放使用 malloc()、calloc()、realloc() 分配的内存或用于 NULL 指针。它应该只用于释放使用 new 运算符分配的内存或用于 NULL 指针。
析构函数它不调用析构函数。它调用析构函数。
可重载它不能被重载。它可以被重载。
类型安全它没有类型安全。它提供类型安全。
速度它比 delete 运算符快。它比 free 运算符慢,因为它在释放内存之前调用被删除对象的析构函数。
内存它在运行时销毁内存。它动态释放内存。

结论

总之,free 函数和 delete 运算符都主要用于释放动态分配的内存。free() 函数是一个库函数,与 malloc() 和 calloc() 一起使用。另一方面,delete 是一个与 new 运算符一起使用来释放内存的运算符。

C++ 中 free 和 delete 的区别常见问题解答

1) 我们可以在 C++ 中使用 free() 函数来释放 new 运算符分配的内存吗?

不能,将 free() 函数与 new 运算符混合使用会导致未定义的行为。我们应该使用 delete 运算符来释放使用 new 函数分配的内存。

2) C++ 中的 delete 运算符是类型安全的吗?

是的,delete 运算符是类型安全的,并与对象的实际类型执行操作以完全销毁它。

3) free() 函数会调用 C++ 对象的析构函数吗?

不会,free() 函数只释放原始内存,不调用任何析构函数。

4) delete 可以在 C++ 中重载吗?

是的,我们可以重载 delete 运算符以实现自定义行为,但不能重载 free 函数。

5) C++ 中 free() 函数和 delete 运算符之间的主要区别是什么?

C++ 中 free() 函数和 delete 运算符之间的主要区别在于,free() 函数释放由 C 风格函数(例如 malloc() 函数)分配的内存。另一方面,delete 运算符释放由 new 运算符分配的内存并调用对象的析构函数。


下一主题C++ 信号处理