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).
#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.
#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
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.
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
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.
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