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

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

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

Оператор delete безопасен для nullptr. Если указатель равен nullptr, вызов delete не приведет к каким-либо действиям или ошибкам.

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

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

Когда вы вызываете delete на указателе, который равен nullptr, ничего не происходит. Это поведение определено стандартом C++ и делает delete безопасным для использования с nullptr. Это означает, что вы можете без опасений вызывать delete на указателе, который может быть равен nullptr, не проверяя его значение заранее.

Пример кода, демонстрирующий это поведение:

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

Комментарии к коду:

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

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

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

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

Твои заметки