Przejdź do głównej treści
eLearner.app
Moduł 7 · Lekcja 1 z 215/18 w kursie~12 min
Lekcje modułu (1/2)

std::unique_ptr i std::shared_ptr

W klasycznym C++ ręczne zarządzanie pamięcią za pomocą operatorów new i delete jest częstym źródłem poważnych błędów, takich jak wycieki pamięci (zasoby nigdy nie zwalniane) lub wiszące wskaźniki (dangling pointers, wskaźniki wskazujące na już zwolnioną pamięć).

Nowoczesny C++ wprowadza inteligentne wskaźniki (Smart Pointers), zdefiniowane w nagłówku <memory>. Automatycznie zarządzają one cyklem życia pamięci przydzielonej na stercie (heap) za pomocą techniki RAII (Resource Acquisition Is Initialization), zwalniając zasób, gdy wskaźnik opuszcza zakres (scope).

std::unique_ptr

std::unique_ptr reprezentuje koncepcję wyłącznej własności zasobu. Nie można go skopiować, a jedynie przenieść (za pomocą std::move).

Code
#include <memory>

// Creazione consigliata tramite std::make_unique (C++14)
std::unique_ptr<int> p1 = std::make_unique<int>(42);

// Accesso alla risorsa come un normale puntatore
std::cout << *p1 << std::endl;

// std::unique_ptr<int> p2 = p1; // ERRORE DI COMPILAZIONE: copia non ammessa!
std::unique_ptr<int> p2 = std::move(p1); // Consentito: p1 cede la proprietà a p2

std::shared_ptr

std::shared_ptr implementuje koncepcję współdzielonej własności (shared ownership). Wiele wskaźników może wskazywać na ten sam zasób. Klasa utrzymuje wewnętrznie licznik odwołań (reference count): pamięć jest zwalniana dopiero wtedy, gdy ostatni aktywny shared_ptr zostanie zniszczony lub zwolniony.

Code
#include <memory>

std::shared_ptr<int> s1 = std::make_shared<int>(100);
std::shared_ptr<int> s2 = s1; // Consentito: incremento del reference count

std::cout << s1.use_count() << std::endl; // Stampa 2 (s1 e s2 condividono la risorsa)

Spróbuj sam

Ćwiczenie#cpp.m7.l1.e1
Próby: 0Ładowanie...

Zadeklaruj std::unique_ptr<int> o nazwie ptr, inicjalizując go za pomocą std::make_unique wartością 42. Wypisz wyłuskaną wartość ptr za pomocą std::cout.

Ładowanie edytora...
Pokaż wskazówkę

Użyj `std::unique_ptr<int> ptr = std::make_unique<int>(42);`, a następnie prześlij `*ptr` do strumienia wyjściowego.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#cpp.m7.l1.e2
Próby: 0Ładowanie...

Utwórz instancję std::shared_ptr<int> o nazwie ptr1 z wartością 100 za pomocą std::make_shared. Utwórz kopię o nazwie ptr2, a na koniec wypisz wartość zwróconą przez ptr1.use_count() za pomocą std::cout.

Ładowanie edytora...
Pokaż wskazówkę

Kopiowanie odbywa się poprzez zwykłe przypisanie `ptr2 = ptr1;`. Wypisując `ptr1.use_count()`, powinieneś zobaczyć wartość 2.

Rozwiązanie dostępne po 3 próbach