Оператор delete (C++)

Отменяет выделение блока памяти.

Синтаксис

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

Замечания

Аргумент cast-expression должен быть указателем на блок памяти, ранее выделенный для объекта, созданного с помощью нового оператора. Оператор delete имеет результат типа void и поэтому не возвращает значение. Например:

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

Использование delete указателя на объект, не выделенный с new непредсказуемыми результатами. Однако можно использовать delete указатель с значением 0. Эта подготовка означает, что при new возврате 0 при сбое удаление результата неудачной new операции является безвредным. Дополнительные сведения см. в разделе "Новые и удаленные операторы".

delete Операторы new также можно использовать для встроенных типов, включая массивы. Если pointer ссылается на массив, поместите пустые квадратные скобки ([]) перед pointer:

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

delete Использование оператора в объекте освобождает память. Программа, которая разыменовывает указатель после удаления объекта, может создать непрогнозируемый результат или вызвать сбой.

Если delete используется для освобождения памяти для объекта класса C++, деструктор объекта вызывается до освобождения памяти объекта (если объект имеет деструктор).

Если операнду оператору delete является изменяемым l-значением, его значение не определено после удаления объекта.

Если указан параметр компилятора /sdl (включение дополнительных проверка безопасности), операнду 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

Оператор удаления вызывает удаление оператора функции.

Для объектов не типа класса (класса, структуры или объединения) вызывается глобальный оператор удаления. Для объектов типа класса имя функции deallocation разрешается в глобальных область если выражение удаления начинается с унарного оператора разрешения область (::). В противном случае перед освобождением памяти оператор удаления вызывает деструктор объекта (если указатель не имеет значения null). Оператор удаления можно определять отдельно для каждого класса; если для некоторого класса такое определение отсутствует, вызывается глобальный оператор удаления. Если выражение удаления используется для освобождения объекта класса, статический тип которого имеет виртуальный деструктор, функция освобождение разрешается через виртуальный деструктор динамического типа объекта.

См. также

Выражения с унарными операторами
Ключевые слова
Операторы new и delete