C ++ shared_ptr

C Shared_ptr



The shared_ptr je jeden typ inteligentných ukazovateľov C ++, ktorý obsahuje zdieľané vlastníctvo objektu vytvoreného ukazovateľom. Pri ukladaní ukazovateľa na iný objekt zdieľa vlastníctvo objektu a počítadlo zdieľaných referencií počíta počet vlastníkov. The shared_ptr zvýši počítadlo referencií o jedno po kopírovaní objektu a zníži referenčné počítadlo o jedno po zničení objektu. Pamäť vo vlastníctve objektu je realokovaná, ak je objekt vo vlastníctve posledného shared_ptr je zničený, alebo resetovať () funkcia sa volá na priradenie iného ukazovateľa objektu. Keď shared_ptr nevlastní žiadny objekt, potom sa tomu hovorí prázdny zdieľaný ukazovateľ. Rôzne spôsoby použitia shared_ptr boli ukázané v tomto návode.

Príklad 1: Deklarujte zdieľaný ukazovateľ rôznymi spôsobmi

V nasledujúcom príklade sú uvedené tri rôzne spôsoby deklarovania zdieľaného ukazovateľa. V kóde bola deklarovaná trieda s konštruktorom a verejnou metódou. Konštruktor vytlačí správu, keď sa pomocou konštruktora vytvorí nový zdieľaný objekt. The Displej () metóda vytlačí správy na základe volajúceho objektu zdieľaného ukazovateľa. Tu bol vytvorený prvý zdieľaný ukazovateľ bez volania konštruktora. Druhý objekt zdieľaného ukazovateľa bol vytvorený volaním konštruktora. Tretí zdieľaný ukazovateľ bol vytvorený priradením prvého zdieľaného ukazovateľa. The Displej () metóda bola zavolaná trikrát pomocou troch objektov zdieľaného ukazovateľa.







// Zahrňte potrebné knižnice

#zahrnúť

#zahrnúť

usingnamespacestd;

// Definujte triedu
classMyClass{
verejná:
// Deklarujte konštruktora
Moja trieda() {
náklady<<„Konštruktér sa volá. n';
}
// Deklarovanie metódy tlače textu
voidDisplay(struna str)
{
náklady<<„Metóda Display () sa volá z<<p<<'ukazovateľ. n';
}
};

intmain()
{
// Inicializácia shared_ptr bez volania konštruktora
shared_ptr p1=make_shared();
p1->Displej('najprv');
// Inicializujte shared_ptr volaním konštruktora
shared_ptr p2=shared_ptr(newMyClass);
p2->Displej('druhý');

// Inicializujte shared_ptr priradením
shared_ptr p3=p1;
p3->Displej(„tretí“);
návrat0;
}

Výkon:



Po spustení vyššie uvedeného kódu sa zobrazí nasledujúci výstup. Konštruktor zavolal iba v čase vytvorenia druhého objektu. Správa konštruktéra bola teda vytlačená iba raz:







Príklad 2: Vytlačte uložené umiestnenie zdieľaného ukazovateľa

Zdieľaný ukazovateľ funkcie get () sa používa na vrátenie uloženého zdieľaného umiestnenia ukazovateľa. Nasledujúci príklad vytlačí umiestnenie uložených, zdieľaných ukazovateľov, ktoré sú vytvorené triedou a funkciou. Tu bola definovaná trieda s konštruktorom, ktorá sa má použiť na vytvorenie zdieľaného ukazovateľa. Bola deklarovaná funkcia na vytvorenie zdieľaného ukazovateľa a vytlačenie umiestnenia zdieľaného ukazovateľa pomocou funkcie get (). V tomto kóde bol prvý zdieľaný ukazovateľ vytvorený pomocou triedy, druhý zdieľaný ukazovateľ bol vytvorený pomocou funkcie a tretí zdieľaný ukazovateľ bol vytvorený priradením prvého ukazovateľa.

// Zahrňte potrebné knižnice

#zahrnúť

#zahrnúť

usingnamespacestd;

// Definujte triedu
classMyClass
{
verejná:
// Deklarujte konštruktora
Moja trieda() {
náklady<<„Konštruktér sa volá. n';
}
};
// Definovanie funkcie na inicializáciu ukazovateľa
voidInit_shared_ptr()
{
shared_ptr p2(newMyClass);
náklady<<p2.dostať() <<' n';
}

intmain()
{
// Inicializujte shared_ptr volaním konštruktora
shared_ptr p1=shared_ptr(newMyClass);
náklady<<p1.dostať() <<' n';

// Inicializujte shared_ptr volaním funkcie
Init_shared_ptr();

// Inicializujte shared_ptr priradením
shared_ptr p3=p1;
náklady<<p3.dostať() <<' n';
návrat0;
}

Výkon:



Po spustení vyššie uvedeného kódu sa objaví nasledujúci podobný výstup. Na výstupe je vrátená hodnota funkcie get () pre prvý a tretí zdieľaný ukazovateľ rovnaká. Druhý zdieľaný ukazovateľ je však iný:

Príklad 3: Spočítajte objekty zdieľaného ukazovateľa

Nasledujúci príklad ukazuje spôsob, ako spočítať počet objektov, na ktoré ukazuje zdieľaný ukazovateľ po vytvorení a zničení ukazovateľa. V kóde bola deklarovaná trieda s konštruktorom. Prvý zdieľaný ukazovateľ bol vytvorený pomocou triedy a druhý zdieľaný ukazovateľ bol vytvorený pomocou prvého zdieľaného ukazovateľa. Počet objektov, na ktoré poukázali obidva zdieľané ukazovatele pred a po zavolaní funkcie reset (), bol vytlačený neskôr.

// Zahrňte potrebné knižnice

#zahrnúť

#zahrnúť

usingnamespacestd;
// Definujte triedu
classMyClass{
verejná:
// Deklarujte konštruktora
Moja trieda() {
náklady<<„Konštruktér sa volá. n';
}
};
intmain()
{
// Inicializujte prvý shared_ptr volaním konštruktora
shared_ptr p1(newMyClass);

// Zobrazí počet objektov shared_ptr podľa prvého ukazovateľa
náklady<<„p1 ukazuje na“<<p1.use_count() <<„predmet (y). n';
// Inicializujte druhý shared_ptr pomocou prvého shared_ptr
shared_ptr p2(p1);
// Zobrazenie počtu objektov shared_ptr podľa prvého a druhého ukazovateľa
náklady<<'p2 smerujúce na'<<p2.use_count() <<„predmet (y). n';
náklady<<„p1 ukazuje na“<<p1.use_count() <<„predmet (y). n';
// Odstráňte vlastníctvo prvého ukazovateľa z objektu shared_ptr
p1.resetovať();
// Zobrazí počet objektov shared_ptr podľa druhého ukazovateľa
náklady<<'p2 smerujúce na'<<p2.use_count() <<„predmet (y). n';
návrat0;
}

Výkon:

Po spustení vyššie uvedeného kódu sa zobrazí nasledujúci výstup. Prvý ukazovateľ, p1 , ukazuje na jeden objekt po vytvorení. Po vytvorení druhého ukazovateľa p2 pomocou prvého ukazovateľa, p1 , oba ukazovatele ukazujú na dva objekty na zdieľanie ukazovateľa. Po zavolaní funkcie reset () pre ukazovateľ p1 jeden objekt bol zničený a ukazovateľ, p2 , teraz ukazuje iba na jeden objekt.

Záver:

Účely použitia zdieľaného ukazovateľa v C ++ boli v tomto návode vysvetlené pomocou jednoduchých príkladov. Vytváranie zdieľaných ukazovateľov rôznymi spôsobmi, získavanie uloženej polohy zdieľaného ukazovateľa a počítanie počtu objektov, na ktoré zdieľané ukazovatele ukazujú. Dúfam, že kodéry C ++ budú môcť po prečítaní tohto tutoriálu použiť zdieľaný ukazovateľ vo svojom kóde.