nullptr и безопасность нулевых указателей
Используйте nullptr вместо NULL или 0 и защищайтесь от разыменования нулевых указателей.
«nullptr и безопасность нулевых указателей» — бесплатный урок C++ Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Что такое нулевой указатель
Нулевой указатель — это специальное значение, указывающее на «ничто». Его разыменование является неопределённым поведением и обычно приводит к сбою с ошибкой сегментации.
nullptr в современном C++
Начиная с C++11 ключевое слово nullptr представляет типизированный литерал нулевого указателя. Предпочитайте его значениям NULL или 0.
int* p1 = nullptr;
int* p2 = NULL; // legacy macro
int* p3 = 0; // legacy literalЗачем нужен nullptr
NULL — это всего лишь макрос для 0. Он может запутать выбор перегрузки между int и int*. nullptr имеет уникальный тип std::nullptr_t.
void f(int);
void f(int*);
f(NULL); // calls f(int) -- surprising!
f(nullptr); // calls f(int*) -- correctПроверка на нулевое значение
Указатели неявно преобразуются в bool: ненулевой указатель означает true, нулевой — false.
if (p) std::cout << "has value\n";
if (!p) std::cout << "is null\n";
if (p != nullptr) std::cout << "explicit form\n";Всегда инициализируйте
Неинициализированные указатели содержат мусор и создают видимость, будто указывают куда-то. Всегда инициализируйте их, даже если просто значением nullptr.
int* p; // BAD: undefined contents
int* q = nullptr; // GOODРазыменование нулевого указателя
Чтение или запись через нулевой указатель является неопределённым поведением. В большинстве настольных систем это приводит к ошибке сегментации. На встраиваемых устройствах память может быть незаметно повреждена.
Защитные проверки
Проверяйте указатель перед разыменованием в общедоступных API или когда вызывающая сторона может передать нулевое значение.
void process(int* data) {
if (!data) return;
*data *= 2;
}Ссылки вместо указателей
Если нулевое значение никогда не имеет смысла, используйте параметр-ссылку. Компилятор гарантирует, что ссылка привязана к какому-либо объекту.
// Before
void f(Widget* w); // can be null?
// After
void f(Widget& w); // must be a real widgetstd::optional для необязательных значений
В C++17 появился std::optional<T> для семантики «значение может присутствовать» — в контекстах без выделения памяти это понятнее, чем указатель, допускающий нулевое значение.
#include <optional>
std::optional<int> find(int x);
if (auto v = find(42)) std::cout << *v;Умные указатели и нулевые значения
std::unique_ptr и std::shared_ptr тоже могут быть нулевыми. Для проверок они преобразуются в bool, а сбрасываются с помощью = nullptr.
Ошибка: висячий указатель после удаления
После выполнения delete p указатель по-прежнему хранит старый адрес. Сбросьте его: p = nullptr;. Умные указатели делают это автоматически.
Быстрая проверка
Какой литерал нулевого указателя следует использовать в современном C++?
Повторение
Используйте nullptr для нулевых значений указателей. Всегда инициализируйте указатели. Проверяйте их перед разыменованием или, что ещё лучше, используйте ссылки и std::optional, если нулевое значение недопустимо.
Часто задаваемые вопросы
Урок «nullptr и безопасность нулевых указателей» бесплатный?
Да — полный текст урока «nullptr и безопасность нулевых указателей» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «nullptr и безопасность нулевых указателей»?
Используйте nullptr вместо NULL или 0 и защищайтесь от разыменования нулевых указателей. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «nullptr и безопасность нулевых указателей»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Обычные указатели и оператор взятия адреса
- Разыменование и арифметика указателей
- nullptr и безопасность нулевых указателей
- Когда использовать указатели, а когда ссылки