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

Что будет если вызвать delete на nullptr

1️⃣ Как кратко ответить

Вызов delete на nullptr безопасен и не приводит к каким-либо действиям. Это поведение гарантируется стандартом C++.

2️⃣ Подробное объяснение темы

В языке C++ оператор delete используется для освобождения памяти, выделенной динамически с помощью оператора new. Однако, в некоторых случаях может возникнуть необходимость вызвать delete на указателе, который не указывает на действительный объект, а равен nullptr. Важно понимать, что стандарт C++ специально предусматривает такую ситуацию и гарантирует, что вызов delete на nullptr не приведет к каким-либо ошибкам или неопределенному поведению.

Почему это важно

Безопасность вызова delete на nullptr позволяет разработчикам писать более надежный код, не беспокоясь о необходимости проверять указатель на nullptr перед его удалением. Это упрощает управление памятью и предотвращает потенциальные ошибки, такие как двойное удаление или удаление неинициализированных указателей.

Пример кода

Рассмотрим простой пример, демонстрирующий вызов delete на nullptr:

#include <iostream>
​
int main() {
    int* ptr = nullptr; // Инициализируем указатель как nullptr
​
    // Попытка удалить память, на которую указывает ptr
    delete ptr; // Безопасно, ничего не происходит
​
    // Для сравнения, выделим память и затем удалим её
    ptr = new int(10); // Выделяем память для одного целого числа и инициализируем его значением 10
    delete ptr; // Освобождаем выделенную память
​
    // Снова устанавливаем ptr в nullptr
    ptr = nullptr;
​
    // Снова вызываем delete на nullptr
    delete ptr; // Безопасно, ничего не происходит
​
    return 0;
}

Пояснение кода

  • int* ptr = nullptr; — Инициализируем указатель ptr значением nullptr, что означает, что он не указывает на какой-либо действительный объект.
  • delete ptr; — Вызов delete на nullptr. Стандарт C++ гарантирует, что это безопасно и не приведет к каким-либо действиям.
  • ptr = new int(10); — Выделяем динамическую память для хранения одного целого числа и инициализируем его значением 10.
  • delete ptr; — Освобождаем выделенную память. Это стандартное использование оператора delete.
  • ptr = nullptr; — Снова устанавливаем ptr в nullptr после освобождения памяти.
  • delete ptr; — Повторный вызов delete на nullptr, который снова безопасен и не приводит к каким-либо действиям.

Заключение

Вызов delete на nullptr является безопасной операцией в C++. Это позволяет упростить управление памятью и избежать дополнительных проверок на nullptr перед удалением указателя. Такое поведение делает код более чистым и менее подверженным ошибкам.

Тема: Память / new-delete / Lifetime
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки