logo

Unique_ptr C++:ssa

std::unique_ptr on C++11:ssä käyttöön otettu älykäs osoitin. Se hallitsee automaattisesti kasan dynaamisesti allokoituja resursseja. Älykkäät osoittimet ovat vain kääreitä tavallisten vanhojen osoittimien ympärille, jotka auttavat sinua estämään laajalle levinneitä vikoja. Nimittäin osoittimen unohtaminen ja muistivuodon aiheuttaminen tai osoittimen vahingossa poistaminen kahdesti tai väärällä tavalla. Niitä voidaan käyttää samalla tavalla kuin tavallisia osoittimia. Ne automatisoivat joitakin manuaalisia prosesseja, jotka aiheuttavat yleisiä virheitä.

Edellytykset: Osoitin C++:ssa , Älykkäät osoittimet C++:ssa.



Syntaksi

unique_ptr<  A>ptr1 (uusi A )>

Tässä,

Mitä tapahtuu, kun käytetään ainutlaatuinen_ptr?

Kun kirjoitamme ainutlaatuinen_ptr ptr1 (uusi A), muisti varataan kasaan tietotyypin A ilmentymälle. ptr1 alustetaan ja osoittaa äskettäin luotuun A-objektiin. Tässä ptr1 on juuri luodun objektin A ainoa omistaja ja se hallitsee tämän objektin elinikää. Tämä tarkoittaa, että kun ptr1 nollataan tai menee soveltamisalan ulkopuolelle, muisti vapautetaan automaattisesti ja A:n objekti tuhoutuu.

Milloin ainutlaatuista_ptr:ää käytetään?

Kun vaaditaan resurssin omistajuutta. Kun haluamme resurssin yksittäisen tai yksinomaisen omistuksen, meidän tulee käyttää ainutlaatuisia osoittimia. Vain yksi yksilöllinen osoitin voi osoittaa yhteen resurssiin. Joten yhtä yksilöllistä osoitinta ei voi kopioida toiseen. Lisäksi se helpottaa automaattista puhdistusta, kun dynaamisesti varatut objektit menevät soveltamisalan ulkopuolelle, ja auttaa estämään muistivuotoja.



Huomautus: Meidän on käytettävä otsikkotiedosto näiden älykkäiden osoittimien käyttöä varten.

Esimerkkejä Unique_ptr

Esimerkki 1:

Luodaan rakenne A ja siinä on menetelmä nimeltä printA tekstin näyttämiseksi. Luodaan sitten pääosiossa yksilöllinen osoitin, joka osoittaa rakenteeseen A. Joten tässä vaiheessa meillä on rakenteen A esiintymä ja p1 pitää osoittimen siihen.

C++






// C++ Program to implement unique_ptr> #include> #include> using> namespace> std;> > struct> A {> >void> printA() { cout <<>'A struct....'> << endl; }> };> > int> main()> {> >unique_ptr p1(> new> A);> >p1->tulostaA();>> >// displays address of the containing pointer> >cout << p1.get() << endl;> >return> 0;> }>

java heitto poikkeus

>

>

Lähtö

A struct.... 0x18dac20>

Esimerkki 2

Luodaan nyt toinen osoitin p2 ja yritämme kopioida osoittimen p1 määritysoperaattorilla (=).

C++




// C++ Program to implement unique_ptr> #include> #include> using> namespace> std;> > struct> A {> >void> printA() { cout <<>'A struct....'> << endl; }> };> int> main()> {> >unique_ptr p1(> new> A);> >p1->tulostaA();>> >// displays address of the containing pointer> >cout << p1.get() << endl;> > >// will give compile time error> >unique_ptr> p2 = p1;> >p2->tulostaA();>> return> 0;> }>

bash for loop
>

>

Lähtö

main.cpp: In function ‘int main()’: main.cpp:18:24: error: use of deleted function ‘std::unique_ptr::unique_ptr(const std::unique_ptr&) [with _Tp = A; _Dp = std::default_delete]’  18 | unique_ptr  p2 = p1;  | ^~ In file included from /usr/include/c++/11/memory:76,  from main.cpp:3: /usr/include/c++/11/bits/unique_ptr.h:468:7: note: declared here  468 | unique_ptr(const unique_ptr&) = delete;  | ^~~~~~~~~~>

Yllä oleva koodi antaa käännösaikavirheen, koska emme voi määrittää osoitinta p2:lle p1 yksilöllisten osoittimien tapauksessa. Meidän on käytettävä siirtosemantiikkaa sellaiseen tarkoitukseen, kuten alla on esitetty.

boto3

Esimerkki 3

A-tyypin objektin hallinta siirtosemantiikan avulla.

C++




// C++ Program to implement unique_ptr> #include> #include> using> namespace> std;> > struct> A {> >void> printA() { cout <<>'A struct....'> << endl; }> };> int> main()> {> >unique_ptr p1(> new> A);> >p1->tulostaA();>> >// displays address of the containing pointer> >cout << p1.get() << endl;> > >// now address stored in p1 shpould get copied to p2> >unique_ptr> p2 = move(p1);> > >p2->tulostaA();>> cout << p1.get() << endl;> >cout << p2.get() << endl;> >return> 0;> }>

>

>

Lähtö

A struct.... 0x2018c20 A struct.... 0 0x2018c20>

Huomaa, kun osoittimen p1 osoite on kopioitu osoittimeen p2, osoittimen p1 osoitteesta tulee NULL(0) ja p2:n tallentama osoite on nyt sama kuin p1:n tallentama osoite, mikä osoittaa, että p1:ssä oleva osoite on siirretty osoittimeen. p2 siirtosemantiikkaa käyttäen.