nullptr i bezpieczeństwo wskaźników null
Używaj nullptr zamiast NULL lub 0 i zabezpieczaj się przed dereferencjonowaniem wartości null
nullptr i bezpieczeństwo wskaźników null to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.
Czym jest wskaźnik null
Wskaźnik null to specjalna wartość wskazująca na „nic”. Jego dereferencja jest niezdefiniowanym zachowaniem — zwykle kończy się błędem segmentacji.
nullptr we współczesnym C++
Od C++11 słowo kluczowe nullptr oznacza typowany literał wskaźnika null. Należy preferować je zamiast NULL lub 0.
int* p1 = nullptr;
int* p2 = NULL; // legacy macro
int* p3 = 0; // legacy literalDlaczego nullptr
NULL to tylko makro oznaczające 0. Może utrudniać rozstrzyganie przeciążenia między int i int*. nullptr ma unikatowy typ std::nullptr_t.
void f(int);
void f(int*);
f(NULL); // calls f(int) -- surprising!
f(nullptr); // calls f(int*) -- correctSprawdzanie wartości null
Wskaźniki można niejawnie konwertować na bool: wskaźnik różny od null daje wartość true, a wskaźnik null — false.
if (p) std::cout << "has value\n";
if (!p) std::cout << "is null\n";
if (p != nullptr) std::cout << "explicit form\n";Zawsze inicjalizować
Niezainicjalizowane wskaźniki zawierają przypadkowe dane i wyglądają, jakby wskazywały jakieś miejsce. Zawsze należy je inicjalizować, nawet jeśli ma to być tylko nullptr.
int* p; // BAD: undefined contents
int* q = nullptr; // GOODDereferencja wskaźnika null
Odczytywanie lub modyfikowanie danych za pośrednictwem wskaźnika null jest niezdefiniowanym zachowaniem. Na większości komputerów stacjonarnych kończy się błędem segmentacji. Na urządzeniach wbudowanych może po cichu prowadzić do uszkodzenia pamięci.
Kontrole ochronne
Przed dereferencją należy sprawdzać wskaźnik w publicznych API lub wszędzie tam, gdzie wywołujący może przekazać wartość null.
void process(int* data) {
if (!data) return;
*data *= 2;
}Referencje zamiast wskaźników
Jeśli wartość null nigdy nie ma znaczenia, należy użyć parametru referencyjnego. Kompilator gwarantuje, że referencja jest powiązana z jakimś obiektem.
// Before
void f(Widget* w); // can be null?
// After
void f(Widget& w); // must be a real widgetstd::optional dla wartości opcjonalnych
W C++17 dodano std::optional<T> do wyrażania semantyki „może zawierać wartość” — w kontekstach niezwiązanych z alokacją jest to rozwiązanie bardziej klarowne niż wskaźnik mogący mieć wartość null.
#include <optional>
std::optional<int> find(int x);
if (auto v = find(42)) std::cout << *v;Inteligentne wskaźniki a null
std::unique_ptr i std::shared_ptr również mogą mieć wartość null. Można je konwertować na bool podczas sprawdzania i resetować za pomocą = nullptr.
Pułapka: wiszący wskaźnik po delete
Po wykonaniu delete p wskaźnik nadal przechowuje stary adres. Należy go zresetować: p = nullptr;. Inteligentne wskaźniki robią to automatycznie.
Szybkie sprawdzenie
Jakiego literału wskaźnika null należy używać we współczesnym C++?
Podsumowanie
Do oznaczania wartości null wskaźnika należy używać nullptr. Wskaźniki zawsze należy inicjalizować. Przed dereferencją trzeba je sprawdzać lub, jeszcze lepiej, używać referencji i std::optional, gdy wartość null nigdy nie jest prawidłowa.
Często zadawane pytania
Czy lekcja „nullptr i bezpieczeństwo wskaźników null” jest bezpłatna?
Tak — pełny tekst „nullptr i bezpieczeństwo wskaźników null” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „nullptr i bezpieczeństwo wskaźników null”?
Używaj nullptr zamiast NULL lub 0 i zabezpieczaj się przed dereferencjonowaniem wartości null Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C++ Academy?
Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „nullptr i bezpieczeństwo wskaźników null”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?
Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Surowe wskaźniki i operator pobrania adresu
- Dereferencjonowanie i arytmetyka wskaźników
- nullptr i bezpieczeństwo wskaźników null
- Kiedy używać wskaźników, a kiedy referencji