Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Да, delete безопасен для nullptr
В C++ стандартом гарантировано, что вызов delete или delete[] на нулевом указателе (nullptr) является полностью безопасной операцией и не приводит к никаким побочным эффектам.
Гарантия стандарта
По стандарту C++ (начиная с C++11):
- Если аргумент
deleteравенnullptr, оператор не выполняет никаких действий - Нет неопределённого поведения (undefined behavior)
- Нет утечек памяти
- Нет segmentation fault
int* ptr = nullptr;
delete ptr; // Полностью безопасно - ничего не происходит
int* arr = nullptr;
delete[] arr; // Также безопасно для массивов
Практическое применение
Это свойство очень полезно при разработке RAII-классов и деструкторов:
class SmartResource {
private:
int* data = nullptr;
public:
~SmartResource() {
delete data; // Безопасно даже если data == nullptr
}
};
Почему это работает
Оператор delete внутри проверяет указатель перед освобождением памяти:
// Псевдокод того, как работает delete
void operator delete(void* ptr) {
if (ptr != nullptr) {
// освобождение памяти
}
// если ptr == nullptr, ничего не происходит
}
Плюсы для кода
- Упрощение логики: не нужно проверять перед delete
- Меньше ошибок: нет забытых проверок
if (ptr != nullptr) - Чистый код: деструкторы становятся короче и понятнее
- RAII дружественно: объекты инициализируются с nullptr и спокойно удаляются
Практический пример
class StringBuffer {
private:
char* buffer = nullptr;
size_t capacity = 0;
public:
StringBuffer() = default;
~StringBuffer() {
delete[] buffer; // Работает даже если buffer == nullptr
}
void allocate(size_t size) {
delete[] buffer; // Безопасная очистка старых данных
buffer = new char[size];
capacity = size;
}
};
Древний C vs современный C++
Это поведение отличается от C, где free(NULL) хотя и определено, но считается антипаттерном в некоторых старых стилях. В C++ это явная часть стандарта и recommended practice.
Вывод
Всегда можно и нужно вызывать delete на nullptr - это безопасно, надёжно и соответствует стандарту C++. Это один из удачных дизайнерских решений языка.