delete 運算子 (C++)

取消配置記憶體區塊。

語法

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

備註

cast-expression 引數必須是先前為使用新運算子 所建立之物件所配置之記憶體區塊的 指標。 運算子 delete 具有 型 void 別的結果,因此不會傳回值。 例如:

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

delete 未配置 new 的物件指標上使用 會提供無法預測的結果。 不過, delete 您可以在值為 0 的指標上使用 。 這項布建表示,在失敗時傳回 0 時 new ,刪除失敗 new 作業的結果是無害的。 如需詳細資訊,請參閱 新的和刪除運算子

newdelete 運算子也可用於內建類型,包括陣列。 如果 pointer 參考陣列,請在 之前 pointer 放置空括弧 ( [] ) :

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

delete 物件上使用 運算子會解除配置其記憶體。 在刪除物件之後將指標取值的程式可能會有無法預期的結果或損毀。

當 用來解除配置 C++ 類別物件的記憶體時 delete ,會在取消設定物件記憶體之前呼叫物件的解構函式(如果物件具有解構函式)。

如果運算子的運算元 delete 是可修改的 l 值,則會在刪除物件之後未定義其值。

如果指定了 /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

針對不是類別類型的物件( 類別 結構 等位 ),會叫用全域刪除運算子。 針對類別類型的物件,如果 delete 運算式以一元範圍解析運算子 ( :: ) 開頭,則會在全域範圍中解析解除配置函式的名稱。 否則,如果指標不是 Null,delete 運算子會在解除配置記憶體之前叫用物件的解構函式。 delete 運算子可以依類別來定義;如果指定類別沒有這類定義,會叫用全域 delete 運算子。 如果使用刪除運算式來解除配置靜態類型包含虛擬解構函式的類別物件,則會透過該物件之動態類型的虛擬解構函式來解析解除配置函式。

另請參閱

具有一元運算子的運算式
關鍵字
new 和 delete 運算子