delete 运算符 (C++)

释放内存块。

语法

[::] deletecast-expression
[::] delete []cast-expression

备注

cast-expression 自变量必须是指向以前分配给使用 new 运算符创建的对象的内存块的指针。 delete 运算符的结果类型为 void,因此它不返回值。 例如:

CDialog* MyDialog = new CDialog;
// use MyDialog
delete MyDialog;

对指向不使用 new 分配的对象的指针使用 delete 将产生不可预知的结果。 但是,可以对值为 0 的指针使用 delete。 此设置意味着,在失败时 new 返回 0 时,删除已失败的 new 操作的结果不会造成损害。 有关详细信息,请参阅 new 和 delete 运算符

newdelete 运算符还可用于内置类型(包括数组)。 如果 pointer 指的是某一数组,请在 pointer 前放置空括号 ([]):

int* set = new int[100];
//use set[]
delete [] set;

对对象使用 delete 运算符将释放其内存。 在删除对象后取消引用指针的程序可能会产生不可预知的结果或崩溃。

使用 delete 释放 C++ 类对象的内存时,将在释放该对象的内存之前调用该对象的析构函数(如果该对象具有析构函数)。

如果 delete 运算符的操作数是可修改的左值,则在删除该对象后未定义其值。

如果指定了 /sdl(启用其他安全检查)编译器选项,则删除对象后, delete 运算符的操作数设置为无效值。

使用 delete

delete 运算符有两个语法变体:一个针对单一对象,另一个针对对象数组。 以下代码片段演示了它们之间的差异:

// expre_Using_delete.cpp
struct UDType
{
};

int main()
{
   // Allocate a user-defined object, UDObject, and an object
   //  of type double on the free store using the
   //  new operator.
   UDType *UDObject = new UDType;
   double *dObject = new double;
   // Delete the two objects.
   delete UDObject;
   delete dObject;
   // Allocate an array of user-defined objects on the
   // free store using the new operator.
   UDType (*UDArr)[7] = new UDType[5][7];
   // Use the array syntax to delete the array of objects.
   delete [] UDArr;
}

以下两种情况会生成未定义的结果:在对象中使用 delete (delete []) 的数组形式,并在数组中使用 delete 的非数组形式。

示例

有关使用 delete 的示例,请参阅 new 运算符

delete 的工作方式

delete 运算符将调用函数运算符 delete

对于不是类类型(classstructunion)的对象,将调用全局 delete 运算符。 对于类类型的对象,如果 delete 表达式以一元范围解析运算符 (::) 开始,则会在全局范围中解析解除分配函数的名称。 否则,delete 运算符将在释放内存之前为对象调用析构函数(如果指针不为 null)。 可为每个类定义 delete 运算符;如果给定类不存在这种定义,则会调用全局 delete 运算符。 如果删除表达式用于释放其静态对象具有虚拟析构函数的类对象,则将通过对象的动态类型的虚拟析构函数解析释放函数。

另请参阅

使用一元运算符的表达式
关键字
new 和 delete 运算符