C++ 中 Delete 和 Delete[] 的区别

2025年3月22日 | 阅读4分钟

在本文中,我们将讨论 C++ 中 DeleteDelete[] 之间的区别。在讨论它们之间的区别之前,我们必须了解 C++ 中的 Delete 和 Delete[] 及其示例。

Delete 概述

Delete 可用于释放使用 new 函数 为单个 对象 动态创建的内存。它将确保在内存释放之前,如果存在,会调用我们对象的析构函数。语法是 delete pointer,其中 pointer 是已分配内存的地址。当 delete 函数用于不是由 new 创建的内存或空指针时,会发生无效行为。必须小心使用 Delete 以防止内存泄漏并确保在不再需要对象时适当地释放系统资源。

  • 它用于释放分配给特定对象的内存。
  • 语法: delete pointer;
  • 它在调用该 指针 指向的单个对象的析构函数(如果存在)期间释放内存。

示例

使用 Delete 释放单个对象的实现代码

输出

 
Constructor called!
Destructor called!   

说明

在此示例中,在 delete 运算符释放使用 new 关键字为单个 MyClass 对象动态分配的内存后,会调用析构函数。

Delete[] 函数概述

内存用于存储 对象数组,当 new[] 函数可使用 delete[] 释放时。数组的析构函数会调用其每个元素,以确保在内存释放之前资源完全释放。动态分配数组的语法是 delete[] pointer,其中 pointer 是第一个元素。它应始终用于防止内存问题,因为在数组上使用 delete 或在单个对象上使用 delete[] 会导致未定义的行为。当适当地使用 delete[] 时,内存会恢复,并且数组的每个元素都会正确删除。

  • 它用于释放为各种对象分配的内存。
  • 语法: delete[] pointer;
  • 它在该特定数组的每个对象的析构函数被调用后释放内存。

示例

使用 Delete[] 释放对象数组的实现代码

输出

 
Constructor called!
Constructor called!
Constructor called!
Destructor called!
Destructor called!
Destructor called!   

说明

通过调用数组中每个对象的析构函数,delete[] 在使用 new[] 动态分配三个对象后释放内存。

Delete 和 Delete[] 函数之间的主要区别

  • 对单个对象使用 delete 函数。
  • 对对象数组使用 delete[] 函数。
  • Delete 函数进行单个对象析构函数调用。
  • 对于数组中的每个条目,析构函数通过 delete[] 调用。
  • 在数组上使用 delete 或在单个对象上使用 delete[] 会导致未定义的行为。
  • 因此,分配类型必须与适当的 delete 形式匹配。

结论

总之,deletedelete[] 的使用也很重要,因为内存应该是动态的。每当我们动态分配对象时,释放该内存就成了一个问题。delete 运算符用于释放先前为对象分配的内存,而当存在对象数组时,delete[] 用于此目的。故意误用可能导致未定义的结果,在某些情况下,甚至可能导致崩溃或可能的内存泄漏,因为错误的用法(将 delete 应用于数组或将 delete[] 应用于单个对象)可能会导致意外的形式。遵循 new 用于 delete 和 new[] 用于 delete[] 以匹配内存分配规则的开发人员可确保正确的资源管理、没有内存泄漏以及析构函数可以正确调用的方式。