C ++ shared_ptr

C Shared_ptr



The shared_ptr je ena vrsta pametnih kazalcev C ++, ki vsebuje deljeno lastništvo predmeta, ki ga je ustvaril kazalec. Pri shranjevanju kazalca v drug predmet si deli lastništvo predmeta, skupni referenčni števec pa šteje število lastnikov. The shared_ptr po kopiranju predmeta poveča referenčni števec za eno in po uničenju predmeta referenčni števec zmanjša za eno. Pomnilnik, ki je v lasti objekta, je ponovno dodeljen, če je predmet v lasti zadnjega shared_ptr je uničen ali ponastaviti() funkcija je poklicana za dodelitev drugega kazalca za predmet. Ko shared_ptr nima v lasti nobenega predmeta, se imenuje prazen kazalec v skupni rabi. Različne uporabe shared_ptr so bile prikazane v tej vadnici.

Primer 1: Razglasite deljeni kazalec na različne načine

V naslednjem primeru so prikazani trije različni načini deklariranja kazalca v skupni rabi. V kodi je bil razglašen razred z konstruktorjem in javno metodo. Konstruktor bo natisnil sporočilo, ko bo z konstruktorjem ustvarjen nov predmet v skupni rabi. The Zaslon () metoda bo natisnila sporočila na podlagi klicajočega predmeta kazalca v skupni rabi. Tu je bil ustvarjen prvi kazalec v skupni rabi brez klicanja konstruktorja. Drugi predmet kazalca v skupni rabi je bil ustvarjen s klicem konstruktorja. Tretji kazalec v skupni rabi je ustvarjen z dodelitvijo prvega kazalca v skupni rabi. The Zaslon () metoda je bila trikrat poklicana z uporabo treh objektov kazalca v skupni rabi.







// Vključi potrebne knjižnice

#vključi

#vključi

usingnamespacestd;

// Določimo razred
classMyClass{
javno:
// Razglasi konstruktor
Moj razred() {
stroški<<'Konstruktor se imenuje. n';
}
// Razglasi način tiskanja besedila
voidDisplay(niz str)
{
stroški<<'Metoda Display () se pokliče iz'<<str<<'kazalec. n';
}
};

intmain()
{
// Inicializiraj shared_ptr brez klicanja konstruktorja
shared_ptr p1=make_shared();
p1->Zaslon('prvi');
// Inicializiramo shared_ptr s klicem constructor
shared_ptr p2=shared_ptr(newMyClass);
p2->Zaslon('drugi');

// Inicializiraj shared_ptr z dodelitvijo
shared_ptr p3=p1;
p3->Zaslon('tretji');
return0;
}

Izhod:



Po izvedbi zgornje kode se prikaže naslednji izhod. Konstruktor je poklical samo v času ustvarjanja drugega predmeta. Sporočilo konstruktorja je bilo torej natisnjeno le enkrat:







Primer 2: Natisnite shranjeno lokacijo kazalca v skupni rabi

Kazalec funkcije get () v skupni rabi se uporablja za vrnitev shranjene lokacije kazalca v skupni rabi. Naslednji primer bo natisnil lokacijo shranjenih kazalcev v skupni rabi, ki jih ustvarita razred in funkcija. Tu je bil definiran razred s konstruktorjem, ki se uporablja za ustvarjanje skupnega kazalca. Razglašena je bila funkcija za ustvarjanje kazalca v skupni rabi in tiskanje lokacije kazalca v skupni rabi s funkcijo get (). V tej kodi je bil prvi kazalec v skupni rabi ustvarjen s pomočjo razreda, drugi kazalec v skupni rabi je bil ustvarjen s funkcijo, tretji kazalec v skupni rabi pa je bil ustvarjen z dodelitvijo prvega kazalca.

// Vključi potrebne knjižnice

#vključi

#vključi

usingnamespacestd;

// Določimo razred
classMyClass
{
javno:
// Razglasi konstruktor
Moj razred() {
stroški<<'Konstruktor se imenuje. n';
}
};
// Določimo funkcijo za inicializacijo kazalca
voidInit_shared_ptr()
{
shared_ptr p2(newMyClass);
stroški<<p2.dobiti() <<' n';
}

intmain()
{
// Inicializiramo shared_ptr s klicem constructor
shared_ptr p1=shared_ptr(newMyClass);
stroški<<p1.dobiti() <<' n';

// Inicializiramo shared_ptr s klicem funkcije
Init_shared_ptr();

// Inicializiraj shared_ptr z dodelitvijo
shared_ptr p3=p1;
stroški<<p3.dobiti() <<' n';
return0;
}

Izhod:



Po izvedbi zgornje kode se prikaže naslednji podoben izhod. V izhodu je vrnjena vrednost funkcije get () za prvi in ​​tretji kazalec v skupni rabi enaka. Drugi kazalec v skupni rabi pa je drugačen:

Primer 3: Preštejte predmete kazalca v skupni rabi

Naslednji primer prikazuje način štetja števila predmetov, na katere kaže kazalec v skupni rabi po ustvarjanju in uničenju kazalca. V kodi je bil razglašen razred z konstruktorjem. Prvi kazalec v skupni rabi je bil ustvarjen z uporabo razreda, drugi kazalec v skupni rabi pa je bil ustvarjen s prvim kazalcem v skupni rabi. Število predmetov, na katera pokažeta oba kazalca v skupni rabi pred in po klicu funkcije reset (), je bilo natisnjeno pozneje.

// Vključi potrebne knjižnice

#vključi

#vključi

usingnamespacestd;
// Določimo razred
classMyClass{
javno:
// Razglasi konstruktor
Moj razred() {
stroški<<'Konstruktor se imenuje. n';
}
};
intmain()
{
// Inicializirajte prvi shared_ptr s klicem constructor
shared_ptr p1(newMyClass);

// Prikaz števila predmetov shared_ptr pri prvem kazalcu
stroški<<'p1 kaže na'<<p1.use_count() <<'predmeti (-i). n';
// Inicializirajte drugi shared_ptr s prvim shared_ptr
shared_ptr p2(p1);
// Prikaz števila predmetov shared_ptr za prvi in ​​drugi kazalec
stroški<<'p2 kaže na'<<p2.use_count() <<'predmeti (-i). n';
stroški<<'p1 kaže na'<<p1.use_count() <<'predmeti (-i). n';
// Odstrani lastništvo prvega kazalca iz predmeta shared_ptr
p1.ponastaviti();
// Prikaz števila predmetov shared_ptr pri drugem kazalcu
stroški<<'p2 kaže na'<<p2.use_count() <<'predmeti (-i). n';
return0;
}

Izhod:

Po izvedbi zgornje kode se prikaže naslednji izhod. Prvi kazalec, p1 , po ustvarjanju kaže na en predmet. Po ustvarjanju drugega kazalca, p2 z uporabo prvega kazalca, p1 , oba kazalca kažeta na dva predmeta za skupno rabo kazalca. Ko pokličete funkcijo reset () za kazalec, p1 , en predmet je bil uničen in kazalec, p2 , zdaj kaže samo na en predmet.

Zaključek:

Namen uporabe kazalca v skupni rabi v C ++ je bil razložen v tej vadnici z uporabo preprostih primerov. Ustvarjanje kazalcev v skupni rabi, pridobivanje shranjene lokacije kazalca v skupni rabi in štetje števila predmetov, na katere kažejo kazalci v skupni rabi. Upam, da bodo koderji C ++ po branju te vadnice lahko uporabili kazalec v skupni rabi v svoji kodi.