0Pricing
C++ Academy · Lekcja

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 literal

Dlaczego 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*) -- correct

Sprawdzanie 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;  // GOOD

Dereferencja 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 widget

std::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

  1. Surowe wskaźniki i operator pobrania adresu
  2. Dereferencjonowanie i arytmetyka wskaźników
  3. nullptr i bezpieczeństwo wskaźników null
  4. Kiedy używać wskaźników, a kiedy referencji
← Powrót do C++ Academy