Оператор delete (C++)
Отменяет выделение блока памяти.
Синтаксис
[
::
]delete
cast-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