C ++ shared_ptr

C Shared_ptr



The shared_ptr ir viens no viedo C ++ rādītāju veidiem, kas satur rādītāja izveidotā objekta kopīgās īpašumtiesības. Tas koplieto objekta īpašumtiesības, saglabājot rādītāju citā objektā, un koplietotā atsauces skaitītājs skaita īpašnieku skaitu. The shared_ptr pēc objekta kopēšanas palielina atsauces skaitītāju par vienu un samazina objekta skaitītāju par vienu pēc objekta iznīcināšanas. Objektam piederošā atmiņa tiek pārdalīta, ja objekts pieder pēdējam shared_ptr tiek iznīcināta, vai atiestatīt () funkcija tiek izsaukta, lai objektam piešķirtu citu rādītāju. Kad shared_ptr nepieder nevienam objektam, tad to sauc par tukšu kopīgu rādītāju. Dažādi lietojumi shared_ptr ir parādīti šajā apmācībā.

1. piemērs. Kopīga rādītāja deklarēšana dažādos veidos

Šajā piemērā ir parādīti trīs dažādi veidi, kā deklarēt koplietojamu rādītāju. Kodeksā ir deklarēta klase ar konstruktoru un publisku metodi. Konstruktors izdrukās ziņojumu, kad ar konstruktoru tiks izveidots jauns koplietots objekts. The Displejs () metode izdrukās ziņojumus, pamatojoties uz kopīgo rādītāja izsaucēja objektu. Šeit pirmais koplietotais rādītāja objekts ir izveidots, neizsaucot konstruktoru. Otrs koplietotais rādītāja objekts ir izveidots, izsaucot konstruktoru. Trešais koplietotais rādītājs ir izveidots, piešķirot pirmo koplietoto rādītāju. The Displejs () metode ir izsaukta trīs reizes, izmantojot trīs koplietotus rādītāju objektus.







// Iekļaut nepieciešamās bibliotēkas

#iekļaut

#iekļaut

usingnamespacestd;

// Definējiet klasi
classMyClass{
publiski:
// Deklarēt konstruktoru
Mana klase() {
izmaksas<<'Konstruktoru sauc. n';
}
// Teksta drukāšanas metodes deklarēšana
voidDisplay(virkne str)
{
izmaksas<<'Displeja () metode tiek izsaukta no'<<lpp<<'rādītājs. n';
}
};

intmain()
{
// Inicializēt shared_ptr, neizsaucot konstruktoru
shared_ptr p1=make_shared();
1. lpp->Displejs('pirmais');
// Inicializējiet shared_ptr, zvanot konstruktoram
shared_ptr p2=shared_ptr(newMyClass);
p2->Displejs('otrais');

// Inicializēt shared_ptr pēc uzdevuma
shared_ptr 3. lpp=1. lpp;
3. lpp->Displejs('trešais');
atgriešanās0;
}

Izeja:



Pēc iepriekš minētā koda izpildes parādīsies šāda izvade. Konstruktors ir piezvanījis tikai otrā objekta izveides laikā. Tātad konstruktora ziņojums ir izdrukāts tikai vienu reizi:







2. piemērs. Izdrukājiet koplietotā rādītāja atrašanās vietu

Funkcijas get () koplietotais rādītājs tiek izmantots, lai atgrieztu saglabāto, koplietoto rādītāja atrašanās vietu. Šajā piemērā tiks izdrukāta uzglabāto, koplietoto rādītāju atrašanās vieta, ko izveidojusi klase un funkcija. Šeit ir definēta klase ar konstruktoru, ko izmantot, lai izveidotu kopīgu rādītāju. Ir deklarēta funkcija, lai izveidotu koplietojamu rādītāju un izdrukātu koplietotā rādītāja atrašanās vietu, izmantojot funkciju get (). Šajā kodā pirmais koplietotais rādītājs ir izveidots, izmantojot klasi, otrs koplietotais rādītājs ir izveidots, izmantojot funkciju, un trešais koplietotais rādītājs ir izveidots, piešķirot pirmo rādītāju.

// Iekļaut nepieciešamās bibliotēkas

#iekļaut

#iekļaut

usingnamespacestd;

// Definējiet klasi
classMyClass
{
publiski:
// Deklarēt konstruktoru
Mana klase() {
izmaksas<<'Konstruktoru sauc. n';
}
};
// Definējiet rādītāja inicializēšanas funkciju
voidInit_shared_ptr()
{
shared_ptr p2(newMyClass);
izmaksas<<p2.gūt() <<' n';
}

intmain()
{
// Inicializējiet shared_ptr, zvanot konstruktoram
shared_ptr p1=shared_ptr(newMyClass);
izmaksas<<1. lpp.gūt() <<' n';

// Inicializēt shared_ptr, zvanot funkcijai
Init_shared_ptr();

// Inicializēt shared_ptr pēc uzdevuma
shared_ptr 3. lpp=1. lpp;
izmaksas<<3. lpp.gūt() <<' n';
atgriešanās0;
}

Izeja:



Pēc iepriekš minētā koda izpildes parādīsies šāda līdzīga izvade. Izvadē funkcijas get () atgrieztā vērtība pirmajiem un trešajiem koplietotajiem rādītājiem ir vienāda. Tomēr otrais koplietotais rādītājs ir atšķirīgs:

3. piemērs: saskaitiet koplietotos rādītāja objektus

Šis piemērs parāda veidu, kā saskaitīt objektu skaitu, uz kuriem norāda rādītājs pēc rādītāja izveidošanas un iznīcināšanas. Kodeksā ir deklarēta klase ar konstruktoru. Pirmais koplietotais rādītājs ir izveidots, izmantojot klasi, un otrs koplietotais rādītājs ir izveidots, izmantojot pirmo koplietoto rādītāju. Objektu skaits, uz kuriem norāda abi koplietotie rādītāji pirms un pēc funkcijas reset () izsaukšanas, ir izdrukāts vēlāk.

// Iekļaut nepieciešamās bibliotēkas

#iekļaut

#iekļaut

usingnamespacestd;
// Definējiet klasi
classMyClass{
publiski:
// Deklarēt konstruktoru
Mana klase() {
izmaksas<<'Konstruktoru sauc. n';
}
};
intmain()
{
// Inicializējiet pirmo shared_ptr, zvanot konstruktorim
shared_ptr p1(newMyClass);

// Parādiet shared_ptr objektu skaitu pēc pirmā rādītāja
izmaksas<<'p1 norāda uz'<<1. lpp.use_count() <<'objekts (-i). n';
// Inicializējiet otro shared_ptr, izmantojot pirmo shared_ptr
shared_ptr p2(1. lpp);
// Parādiet shared_ptr objektu skaitu pēc pirmā un otrā rādītāja
izmaksas<<'p2 norāda uz'<<p2.use_count() <<'objekts (-i). n';
izmaksas<<'p1 norāda uz'<<1. lpp.use_count() <<'objekts (-i). n';
// Pirmā rādītāja īpašumtiesību noņemšana no objekta shared_ptr
1. lpp.atiestatīt();
// Parādiet shared_ptr objektu skaitu ar otro rādītāju
izmaksas<<'p2 norāda uz'<<p2.use_count() <<'objekts (-i). n';
atgriešanās0;
}

Izeja:

Pēc iepriekš minētā koda izpildes parādīsies šāda izvade. Pirmais rādītājs, 1. lpp , pēc izveides norāda uz vienu objektu. Pēc otrā rādītāja izveidošanas p2 , izmantojot pirmo rādītāju, 1. lpp , abi rādītāji norāda uz diviem objektiem, lai koplietotu rādītāju. Pēc rādītāja funkcijas reset () izsaukšanas 1. lpp , viens objekts ir iznīcināts, un rādītājs, p2 , tagad norāda tikai uz vienu objektu.

Secinājums:

Šajā apmācībā, izmantojot vienkāršus piemērus, ir izskaidroti koplietotā rādītāja izmantošanas mērķi C ++. Kopīgu rādītāju izveide dažādos veidos, kopīgas rādītāja atrašanās vietas saglabāšana un koplietoto rādītāju norādīto objektu skaita skaitīšana. Es ceru, ka C ++ kodētāji pēc šīs apmācības izlasīšanas varēs izmantot koplietoto rādītāju savā kodā.