В C++
delete nullptr безопасен и не делает ничего. Стандарт гарантирует, что delete не вызывает ошибок при передаче nullptr. int* p = nullptr;
delete p; // НИЧЕГО НЕ ПРОИЗОЙДЁТ (без ошибки)
🚩Почему `delete nullptr` не вызывает ошибку?
Стандарт C++ (C++98, C++11, C++17, C++20) говорит:
> Если переданный в
delete указатель равен nullptr, то delete ничего не делает. Это сделано, чтобы избежать избыточных проверок в коде:
if (ptr) { // Проверка не нужна
delete ptr;
}🚩Как работает `delete` внутри?
Когда вызывается
delete p, компилятор: Проверяет, равен ли
p nullptr. Если да → ничего не делает. Вызывает деструктор объекта, если
p не nullptr. Освобождает память с помощью
operator delete(). 🚩Что с `delete[]`?
Тоже безопасно
int* arr = nullptr;
delete[] arr; // НИЧЕГО НЕ ПРОИЗОЙДЁТ
🚩Ошибки, которых `delete nullptr` помогает избежать
Безопасно
void destroy(int* p) {
delete p; // Даже если p == nullptr, ошибки не будет
}Опасность: двойное удаление
Хотя
delete nullptr безопасен, удаление уже освобождённого указателя — ошибка!int* p = new int(10);
delete p; // Освободили память
delete p; // ❌ НЕСКОЛЬКО DELETE - неопределённое поведение (UB)!
Решение: после
delete занулять указатель int* p = new int(10);
delete p;
p = nullptr; // Теперь повторный delete безопасен
delete p; // ОК, ничего не делает
Ставь 👍 и забирай 📚 Базу знаний