C ++ shared_ptr

C Shared_ptr



The shared_ptr je jedna vrsta pametnih pokazivača C ++ koja sadrži zajedničko vlasništvo nad objektom koji je stvorio pokazivač. Dijeli vlasništvo nad objektom prilikom spremanja pokazivača u drugi objekt, a zajednički brojač referenci broji broj vlasnika. The shared_ptr povećava brojač referenci za jedan nakon kopiranja objekta i smanjuje brojač referenci za jedan nakon uništavanja objekta. Memorija u vlasništvu objekta preraspodjeljuje se ako je objekt u vlasništvu zadnjeg shared_ptr je uništena, ili reset () funkcija se poziva za dodjeljivanje drugog pokazivača za objekt. Kada shared_ptr ne posjeduje nijedan objekt, tada se naziva praznim zajedničkim pokazivačem. Različite uporabe shared_ptr prikazani su u ovom vodiču.

Primjer 1: Deklarirajte dijeljeni pokazivač na različite načine

U sljedećem primjeru prikazana su tri različita načina deklariranja zajedničkog pokazivača. Klasa s konstruktorom i javna metoda deklarirana je u kodu. Konstruktor će ispisati poruku kada se s konstruktorom stvori novi dijeljeni objekt. The Prikaz() method ispisat će poruke na temelju pozivanog zajedničkog objekta pokazivača. Ovdje je stvoren prvi objekt dijeljenog pokazivača bez pozivanja konstruktora. Drugi objekt dijeljenog pokazivača kreiran je pozivanjem konstruktora. Treći dijeljeni pokazivač je kreiran dodjelom prvog zajedničkog pokazivača. The Prikaz() Metoda je tri puta pozvana pomoću tri objekta dijeljenih pokazivača.







// Uključuje potrebne knjižnice

#uključi

#uključi

usingnamespacestd;

// Definirajte klasu
classMyClass{
javnost:
// Deklariraj konstruktor
Moj razred() {
trošak<<'Konstruktor se zove. n';
}
// Deklarirajte način ispisa teksta
voidDisplay(string str)
{
trošak<<'Metoda Display () poziva se iz'<<str<<'pokazivač. n';
}
};

intmain()
{
// Inicijaliziraj shared_ptr bez pozivanja konstruktora
shared_ptr p1=make_shared();
p1->Prikaz('prvi');
// Inicijaliziraj shared_ptr pozivanjem konstruktora
shared_ptr p2=shared_ptr(newMyClass);
p2->Prikaz('drugi');

// Inicijaliziraj shared_ptr dodjelom
shared_ptr p3=p1;
p3->Prikaz('treći');
return0;
}

Izlaz:



Sljedeći izlaz će se pojaviti nakon izvršavanja gornjeg koda. Konstruktor je pozvao samo u vrijeme stvaranja drugog objekta. Dakle, poruka konstruktora je ispisana samo jednom:







Primjer 2: Ispišite pohranjenu lokaciju dijeljenog pokazivača

Dijeljeni pokazivač funkcije get () koristi se za vraćanje pohranjenog, dijeljenog mjesta pokazivača. Sljedeći će primjer ispisati lokaciju pohranjenih, zajedničkih pokazivača koje su stvorile klasa i funkcija. Ovdje je definirana klasa s konstruktorom koja se koristi za stvaranje zajedničkog pokazivača. Deklarirana je funkcija za stvaranje dijeljenog pokazivača i ispis lokacije dijeljenog pokazivača pomoću funkcije get (). U ovom je kodu prvi zajednički pokazivač kreiran pomoću klase, drugi zajednički pokazivač kreiran je pomoću funkcije, a treći dijeljeni pokazivač je kreiran dodjelom prvog pokazivača.

// Uključuje potrebne knjižnice

#uključi

#uključi

usingnamespacestd;

// Definirajte klasu
classMyClass
{
javnost:
// Deklariraj konstruktor
Moj razred() {
trošak<<'Konstruktor se zove. n';
}
};
// Definiranje funkcije za inicijalizaciju pokazivača
voidInit_shared_ptr()
{
shared_ptr p2(newMyClass);
trošak<<p2.dobiti() <<' n';
}

intmain()
{
// Inicijaliziraj shared_ptr pozivanjem konstruktora
shared_ptr p1=shared_ptr(newMyClass);
trošak<<p1.dobiti() <<' n';

// Pokretanje shared_ptr pozivanjem funkcije
Init_shared_ptr();

// Inicijaliziraj shared_ptr dodjelom
shared_ptr p3=p1;
trošak<<p3.dobiti() <<' n';
return0;
}

Izlaz:



Sljedeći sličan izlaz pojavit će se nakon izvršavanja gornjeg koda. U izlazu je vraćena vrijednost get () funkcije za prvi i treći zajednički pokazivač. Međutim, drugi zajednički pokazivač je drugačiji:

Primjer 3: Prebrojte objekte dijeljenih pokazivača

Sljedeći primjer prikazuje način prebrojavanja broja objekata usmjerenih zajedničkim pokazivačem nakon stvaranja i uništavanja pokazivača. U kodu je deklarirana klasa s konstruktorom. Prvi dijeljeni pokazivač kreiran je pomoću klase, a drugi dijeljeni pokazivač kreiran je pomoću prvog dijeljenog pokazivača. Kasnije je ispisan broj objekata na koje ukazuju oba zajednička pokazivača prije i nakon pozivanja funkcije reset ().

// Uključuje potrebne knjižnice

#uključi

#uključi

usingnamespacestd;
// Definirajte klasu
classMyClass{
javnost:
// Deklariraj konstruktor
Moj razred() {
trošak<<'Konstruktor se zove. n';
}
};
intmain()
{
// Inicijaliziraj prvi shared_ptr pozivanjem konstruktora
shared_ptr p1(newMyClass);

// Prikaz broja shared_ptr objekata prema prvom pokazivaču
trošak<<'p1 pokazuje na'<<p1.use_count() <<'objekt (i). n';
// Inicijalizirajte drugi shared_ptr koristeći prvi shared_ptr
shared_ptr p2(p1);
// Prikaz broja shared_ptr objekata prema prvom i drugom pokazivaču
trošak<<'p2 pokazuje na'<<p2.use_count() <<'objekt (i). n';
trošak<<'p1 pokazuje na'<<p1.use_count() <<'objekt (i). n';
// Ukloniti vlasništvo nad prvim pokazivačem iz shared_ptr objekta
p1.resetirati();
// Prikaz broja shared_ptr objekata prema drugom pokazivaču
trošak<<'p2 pokazuje na'<<p2.use_count() <<'objekt (i). n';
return0;
}

Izlaz:

Sljedeći izlaz će se pojaviti nakon izvršavanja gornjeg koda. Prvi pokazivač, p1 , pokazuje na jedan objekt nakon stvaranja. Nakon stvaranja drugog pokazivača, p2 , pomoću prvog pokazivača, p1 , oba pokazivača pokazuju na dva objekta za dijeljenje pokazivača. Nakon pozivanja funkcije reset () za pokazivač, p1 , jedan objekt je uništen, a pokazivač, p2 , sada pokazuje samo na jedan objekt.

Zaključak:

Svrhe korištenja zajedničkog pokazivača u C ++ objašnjene su u ovom vodiču pomoću jednostavnih primjera. Stvaranje zajedničkih pokazivača na različite načine, dobivanje spremljene lokacije zajedničkog pokazivača i brojanje broja objekata na koje dijele pokazivači. Nadam se da će C ++ koderi moći pročitati zajednički pokazivač u svom kodu nakon čitanja ovog vodiča.