Оператор delete применяется для освобождения памяти выделенной оператором new или new [].
- На каждый оператор new должен идти оператор delete.
- На каждый оператор new [] должен идти оператор delete [].
- После удаления указателя им нельзя пользоваться, потому что эта память уже может использоваться другими переменными или программами и это может привести к логическим ошибка или падению программы. Иногда для определения что указатель был удален, ему присваивают значение nullptr.
#include <iostream>
using namespace std;
int main(void) {
int* p = new int(3); // Создали указатель на int и присвоили ему значение 3
cout << *p << endl; //3 Вывели значение по адресу указателя
delete p; // Удалили указатель
int *ar = new int[10]; // Создали указатель на int и присвоили ему значение 3
cout << ar << endl; // Вывели адрес указателя (массива)
delete [] ar; // Удалили массив. Если память выделяется через type[] то удаляется через delete []
cout << ar[0] << endl; // Вывели адрес указателя (массива)
}
Начиная с С++11 delete может применятся как спецификатор ограничения доступа к функциям и операторам класса.
#include <iostream>
using namespace std;
class Test{ // Класс Test
public:
Test(){ // Конструктор без параметров
cout << "Test()" << endl; // Выведем надпись Test() при вызове конструктора
}
Test(int) = delete; // Конструктор с параметром int запрещен для вызова спецификатором delete
Test(float f){ // Конструктор с параметром типа float
cout << "Test(" << f << ")" << endl; // Выведем надпись Test(параметр) при вызове конструктора
}
};
int main(void) {
Test t1; //Test()
Test t2(1); // Выдаст ошибку use of deleted function 'Test::Test(int)' так как конструктор с int имеет спецификатор delete
Test t3(1.0f); //Test(1)
}