在C++中,delete
和 delete[]
是用于释放由 new
和 new[]
动态分配的内存的运算符。它们之间的主要区别在于它们处理的对象类型以及它们如何执行内存释放。以下是对这两个运算符的详细技术分析,并通过代码示例来展示它们之间的区别。
技术分析
处理对象类型:
delete
用于释放由new
动态分配的单个对象或指针。delete[]
用于释放由new[]
动态分配的数组。
析构函数调用:
当使用 delete
释放单个对象时,它只会调用一次该对象的析构函数。当使用 delete[]
释放数组时,它会首先调用数组中每个元素的析构函数(如果有的话),然后释放整个数组的内存空间。
内存管理:
delete
仅释放单个对象所占用的内存空间。delete[]
释放整个数组占用的内存空间,并确保每个数组元素(如果有析构函数)都被正确销毁。
代码示例
以下代码示例展示了如何使用 delete
和 delete[]
来释放内存,以及它们之间的区别。
#include <iostream>
class MyClass {
public:
MyClass() { std::cout << "Constructor called" << std::endl; }
~MyClass() { std::cout << "Destructor called" << std::endl; }
};
int main() {
// 分配单个对象
MyClass* singleObject = new MyClass;
// 释放单个对象
delete singleObject; // 调用一次析构函数
// 分配对象数组
MyClass* objectArray = new MyClass[3];
// 释放对象数组
delete[] objectArray; // 调用每个元素的析构函数
// 分配整型数组
int* intArray = new int[5];
// 释放整型数组
delete[] intArray; // 释放内存,但不会调用析构函数(int 类型没有析构函数)
// 错误示例:使用 delete 释放数组
int* intArray2 = new int[5];
// delete intArray2; // 这会导致未定义行为,可能引发内存泄漏或程序崩溃
// 分配单个 int
int* singleInt = new int;
// 释放单个 int
delete singleInt; // 正确释放内存
return 0;
}
输出结果
Constructor called
Destructor called
Constructor called
Constructor called
Constructor called
Destructor called
Destructor called
Destructor called
总结
对于单个对象,应使用 delete
释放内存,它会调用该对象的析构函数一次。对于数组,应使用 delete[]
释放内存,它会调用数组中每个元素的析构函数(如果有的话),然后释放整个数组的内存空间。
混淆使用 delete
和 delete[]
可能导致内存泄漏或程序崩溃,因此在使用时应特别注意它们之间的区别。