std::unique_ptr yra išmanioji rodyklė, pristatyta C++11. Jis automatiškai valdo dinamiškai paskirstytus išteklius krūvoje. Išmaniosios rodyklės yra tik įprastų senų rodyklių apvyniojimas, padedantis išvengti plačiai paplitusių klaidų. Būtent, pamiršus ištrinti žymeklį ir sukelti atminties nutekėjimą arba netyčia ištrinti žymeklį du kartus arba netinkamu būdu. Jie gali būti naudojami panašiai kaip standartinės rodyklės. Jie automatizuoja kai kuriuos rankinius procesus, kurie sukelia įprastas klaidas.
Būtinos sąlygos: Rodyklė C++ , Išmaniosios rodyklės C++.
Sintaksė
unique_ptr< A>ptr1 (naujas A )>>Čia
- unikalus_ptr : Jis nurodo std::unique_ptr tipą. Šiuo atveju - A tipo objektas.
- naujas A : A tipo objektas dinamiškai priskiriamas krūvoje naudojant naują operatorių.
- ptr1 : Tai yra std::unique_ptr kintamojo pavadinimas.
Kas atsitinka, kai naudojamas unikalus_ptr?
Kai rašome unikalus_ptr ptr1 (naujas A), atmintis priskiriama A duomenų tipo egzemplioriaus krūvai. ptr1 inicijuojamas ir nurodo naujai sukurtą A objektą. Čia ptr1 yra vienintelis naujai sukurto objekto A savininkas ir valdo šio objekto gyvavimo laiką. Tai reiškia, kad atstačius ptr1 arba išėjus iš jo taikymo srities, atmintis automatiškai atlaisvinama ir A objektas sunaikinamas.
Kada naudoti unikalų_ptr?
Kai reikalinga išteklių nuosavybė. Kai norime turėti vieną ar išskirtinę išteklių nuosavybę, turėtume vadovautis unikaliomis nuorodomis. Tik viena unikali rodyklė gali nurodyti vieną šaltinį. Taigi vienos unikalios rodyklės negalima nukopijuoti į kitą. Be to, tai palengvina automatinį valymą, kai dinamiškai priskirti objektai išeina iš taikymo srities, ir padeda išvengti atminties nutekėjimo.
Pastaba: turime naudoti antraštės failas, skirtas naudoti šias išmaniąsias rodykles.
Unique_ptr
1 pavyzdys:
Leidžia sukurti struktūrą A ir joje bus metodas, pavadintas printA, kad būtų rodomas tekstas. Tada pagrindinėje skiltyje sukurkime unikalią rodyklę, kuri nurodys struktūrą A. Taigi šiuo metu turime struktūros A egzempliorių, o p1 turi žymeklį į jį.
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->spausdintiA();>> // displays address of the containing pointer> >cout << p1.get() << endl;> >return> 0;> }> |
labas pasaulis su java
>Išvestis
A struct.... 0x18dac20>
2 pavyzdys
Dabar sukurkime kitą žymeklį p2 ir pabandysime nukopijuoti žymeklį p1 naudodami priskyrimo operatorių (=).
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->spausdintiA();>> // displays address of the containing pointer> >cout << p1.get() << endl;> > >// will give compile time error> >unique_ptr> p2 = p1;> >p2->spausdintiA();>> 0;> }> |
>
kaip rūšiuoti masyvą java
>
Išvestis
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; | ^~~~~~~~~~>
Aukščiau pateiktas kodas duos kompiliavimo laiko klaidą, nes unikalių rodyklių atveju negalime priskirti žymeklio p2 prie p1. Turime naudoti judėjimo semantiką tokiam tikslui, kaip parodyta žemiau.
burbulų rūšiavimo python
3 pavyzdys
A tipo objekto valdymas naudojant judėjimo semantiką.
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->spausdintiA();>> // 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->spausdintiA();>> >cout << p2.get() << endl;> >return> 0;> }> |
>
>Išvestis
A struct.... 0x2018c20 A struct.... 0 0x2018c20>
Atkreipkite dėmesį, kai adresas žymeklyje p1 nukopijuotas į rodyklę p2, rodyklės p1 adresas tampa NULL(0), o p2 saugomas adresas dabar yra toks pat kaip ir p1 saugomas adresas, rodantis, kad adresas p1 buvo perkeltas į žymeklį. p2 naudojant judėjimo semantiką.