C ++ shared_ptr

C ++ shared_ptr
shared_ptr jest jednym typem inteligentnych wskazówek C ++, który zawiera wspólną własność obiektu stworzonego przez wskaźnik. Dzieli własność obiektu podczas przechowywania wskaźnika w inny obiekt, a wspólny licznik referencyjny zlicza liczbę właścicieli. shared_ptr zwiększa licznik odniesienia o jeden po skopiowaniu obiektu i zmniejsza licznik odniesienia o jeden po zniszczeniu obiektu. Pamięć należąca do obiektu jest realokowana, jeśli obiekt należący do ostatniego shared_ptr jest zniszczony lub Resetowanie() Funkcja jest wywoływana, aby przypisać kolejny wskaźnik obiektu. Kiedy shared_ptr nie posiada żadnego obiektu, wówczas nazywa się go pustym wskaźnikiem udostępnionym. Różne zastosowania shared_ptr zostały pokazane w tym samouczku.

Przykład 1: Deklaruj udostępniony wskaźnik na różne sposoby

Trzy różne sposoby deklarowania współdzielonego wskaźnika pokazano w poniższym przykładzie. Klasa z konstruktorem i metodą publiczną zostały ogłoszone w kodzie. Konstruktor wydrukuje komunikat, gdy nowy współdzielony obiekt zostanie utworzony z konstruktorem. Wyświetlacz() Metoda będzie drukować wiadomości w oparciu o obiekt Wspólne Wskaźnik. Tutaj pierwszy obiekt współdzielonego wskaźnika został utworzony bez wywoływania konstruktora. Drugi współdzielony obiekt wskaźnika został utworzony przez wywołanie konstruktora. Trzeci udostępniony wskaźnik utworzył poprzez przypisanie pierwszego udostępnionego wskaźnika. Wyświetlacz() Metoda została wywołana trzykrotnie przy użyciu trzech wspólnych obiektów wskaźnika.

// Dołącz niezbędne biblioteki
#włączać
#włączać
używającnamespacestd;
// Zdefiniuj klasę
classMyClass
publiczny:
// zadeklaruj konstruktora
Moja klasa()
Cout<<"The constructor is called.\n";

// zadeklaruj metodę drukowania tekstu
voiddisplay (string str)

Cout<<"The Display() method is called from the "<< str <<" pointer.\n";

;
intmain ()

// Zainicjuj shared_ptr bez wywoływania konstruktora
shared_ptr p1 = make_shared ();
p1-> wyświetlacz („pierwszy”);
// Zainicjuj shared_ptr, wywołując konstruktor
shared_ptr p2 = shared_ptr (newMyClass);
p2-> wyświetlacz („drugi”);
// zainicjuj shared_ptr według przypisania
shared_ptr p3 = p1;
p3-> wyświetlacz („trzeci”);
return0;

Wyjście:

Następujące dane wyjściowe pojawią się po wykonaniu powyższego kodu. Konstruktor wezwał tylko w momencie tworzenia drugiego obiektu. Tak więc przesłanie konstruktora zostało wydrukowane tylko raz:

Przykład 2: Wydrukuj przechowywaną lokalizację współdzielonego wskaźnika

Wskaźnik udostępniony get () jest używany do zwracania przechowywanej, udostępnionej lokalizacji wskaźnika. Poniższy przykład wydrukuje lokalizację przechowywanych, wspólnych wskaźników tworzonych przez klasę i funkcję. Tutaj zdefiniowano klasę z konstruktorem do tworzenia udostępnionego wskaźnika. Funkcja została zadeklarowana w celu utworzenia udostępnionego wskaźnika i wydrukowania lokalizacji wskaźnika udostępnionego za pomocą funkcji get (). W tym kodzie pierwsza współdzielona wskaźnik został utworzony za pomocą klasy, drugi współdzielony wskaźnik został utworzony za pomocą funkcji, a trzeci wskaźnik udostępniony został utworzony przez przypisanie pierwszego wskaźnika.

// Dołącz niezbędne biblioteki
#włączać
#włączać
używającnamespacestd;
// Zdefiniuj klasę
Classmyclass

publiczny:
// zadeklaruj konstruktora
Moja klasa()
Cout<<"The constructor is called.\n";

;
// Zdefiniuj funkcję, aby zainicjować wskaźnik
voidinit_shared_ptr ()

shared_ptr p2 (newMyClass);
Cout<
intmain ()

// Zainicjuj shared_ptr, wywołując konstruktor
shared_ptr p1 = shared_ptr (newMyClass);
Cout<// Zainicjuj shared_ptr, wywołując funkcję
Init_shared_ptr ();
// zainicjuj shared_ptr według przypisania
shared_ptr p3 = p1;
Cout<return0;

Wyjście:

Poniższe podobne dane wyjściowe pojawi się po wykonaniu powyższego kodu. W wyjściu zwrócona wartość funkcji get () dla pierwszych i trzecich wskaźników współdzielonych jest taka sama. Jednak drugi współdzielony wskaźnik jest inny:

Przykład 3: Policz obiekty współdzielonego wskaźnika

Poniższy przykład przedstawia sposób na zliczenie liczby obiektów wskazanych przez wspólny wskaźnik po utworzeniu i zniszczeniu wskaźnika. W kodzie zadeklarowano klasę z konstruktorem. Pierwszy współdzielony wskaźnik został utworzony za pomocą klasy, a drugi wskaźnik udostępniony został utworzony za pomocą pierwszego współdzielonego wskaźnika. Liczba obiektów wskazanych oba współdzielone wskaźniki przed i po wywołaniu funkcji RESET () została wydrukowana później.

// Dołącz niezbędne biblioteki
#włączać
#włączać
używającnamespacestd;
// Zdefiniuj klasę
classMyClass
publiczny:
// zadeklaruj konstruktora
Moja klasa()
Cout<<"The constructor is called.\n";

;
intmain ()

// Zainicjuj pierwszy shared_ptr, wywołując konstruktor
shared_ptr p1 (newMyClass);
// Wyświetl liczbę obiektów shared_ptr według pierwszego wskaźnika
Cout<<"p1 pointing to "<< p1.use_count() <<" object(s).\n";
// Zainicjuj drugie shared_ptr za pomocą pierwszego shared_ptr
shared_ptr p2 (p1);
// Wyświetl liczbę obiektów shared_ptr przez pierwsze i drugie wskaźniki
Cout<<"p2 pointing to "<< p2.use_count() <<" object(s).\n";
Cout<<"p1 pointing to "<< p1.use_count() <<" object(s).\n";
// Usuń własność pierwszego wskaźnika z obiektu shared_ptr
P1.Resetowanie();
// Wyświetl liczbę obiektów shared_ptr według drugiego wskaźnika
Cout<<"p2 pointing to "<< p2.use_count() <<" object(s).\n";
return0;

Wyjście:

Następujące dane wyjściowe pojawią się po wykonaniu powyższego kodu. Pierwszy wskaźnik, P1, wskazuje na jeden obiekt po utworzeniu. Po utworzeniu drugiego wskaźnika, P2, Korzystanie z pierwszego wskaźnika, P1, Oba wskaźniki wskazują na dwa obiekty do udostępniania wskaźnika. Po wywołaniu funkcji RESET () dla wskaźnika, P1, Jeden obiekt został zniszczony, a wskaźnik, P2, teraz wskazuje tylko na jeden obiekt.

Wniosek:

Cele użycia współdzielonego wskaźnika w C ++ zostały wyjaśnione w tym samouczku za pomocą prostych przykładów. Tworzenie współdzielonych wskaźników na różne sposoby, przechowywanie lokalizacji udostępnionego wskaźnika i liczenie liczby obiektów wskazanych przez współdzielone wskaźniki. Mam nadzieję, że kodery C ++ będą mogły użyć współdzielonego wskaźnika w swoim kodzie po przeczytaniu tego samouczka.