← Назад к вопросам

Безопасен ли delete для nullptr?

1.0 Junior🔥 151 комментариев
#Язык C++

Комментарии (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++. Это один из удачных дизайнерских решений языка.

Безопасен ли delete для nullptr? | PrepBro