std::unique_ptr este un pointer inteligent introdus în C++11. Gestionează automat resursele alocate dinamic pe heap. Indicatoarele inteligente sunt doar învelișuri în jurul indicatoarelor vechi obișnuite care vă ajută să preveniți erorile răspândite. Și anume, uitarea de a șterge un pointer și cauzarea unei scurgeri de memorie sau ștergerea accidentală a unui indicator de două ori sau în mod greșit. Ele pot fi folosite într-un mod similar cu indicatoarele standard. Ei automatizează unele dintre procesele manuale care provoacă erori comune.
Cerințe preliminare: Pointer în C++ , Indicatori inteligente în C++.
Sintaxă
unique_ptr< A>ptr1 (nou A )>>>Aici,
- unic_ptr : Specifică tipul std::unique_ptr. În acest caz, un obiect de tip A.
- noua A : Un obiect de tip A este alocat dinamic pe heap folosind operatorul nou.
- ptr1 : Acesta este numele variabilei std::unique_ptr.
Ce se întâmplă când este utilizat unique_ptr?
Când scriem unic_ptr ptr1 (nou A), memoria este alocată pe heap pentru o instanță de tip de date A. ptr1 este inițializată și indică către obiectul A nou creat. Aici, ptr1 este singurul proprietar al noului obiect A creat și gestionează durata de viață a acestui obiect. Aceasta înseamnă că atunci când ptr1 este resetat sau iese din domeniul de aplicare, memoria este dealocată automat și obiectul lui A este distrus.
Când să folosiți unique_ptr?
Când este necesară proprietatea asupra resursei. Când dorim o proprietate unică sau exclusivă a unei resurse, atunci ar trebui să alegem indicații unice. Doar un indicator unic poate indica o singură resursă. Deci, un indicator unic nu poate fi copiat pe altul. De asemenea, facilitează curățarea automată atunci când obiectele alocate dinamic ies din domeniul de aplicare și ajută la prevenirea scurgerilor de memorie.
Notă: Trebuie să folosim fișier antet pentru utilizarea acestor indicatori inteligente.
Exemple de Unique_ptr
Exemplul 1:
Să creăm o structură A și va avea o metodă numită printA pentru a afișa ceva text. Apoi, în secțiunea principală, să creăm un indicator unic care va indica structura A. Deci, în acest moment, avem o instanță a structurii A și p1 deține indicatorul către aceasta.
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->printA();>>> // displays address of the containing pointer> >cout << p1.get() << endl;> >return> 0;> }> |
excepție de aruncare java
>Ieșire
A struct.... 0x18dac20>
Exemplul 2
Acum să creăm un alt pointer p2 și vom încerca să copiem indicatorul p1 folosind operatorul de atribuire (=).
C++
eroare de atribut python
// 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->printA();>>> // displays address of the containing pointer> >cout << p1.get() << endl;> > >// will give compile time error> >unique_ptr> p2 = p1;> >p2->printA();>>> 0;> }> |
>
>
Ieșire
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; | ^~~~~~~~~~>
Codul de mai sus va da o eroare de timp de compilare, deoarece nu putem aloca pointerul p2 la p1 în cazul pointerilor unici. Trebuie să folosim semantica mutarii în acest scop, așa cum se arată mai jos.
retele neuronale artificiale
Exemplul 3
Gestionarea obiectului de tip A folosind semantica mutarii.
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->printA();>>> // 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->printA();>>> >cout << p2.get() << endl;> >return> 0;> }> |
>
>Ieșire
A struct.... 0x2018c20 A struct.... 0 0x2018c20>
Rețineți că odată ce adresa din pointerul p1 este copiată în pointerul p2, adresa pointerului p1 devine NULL(0) și adresa stocată de p2 este acum aceeași cu adresa stocată de p1, ceea ce arată că adresa din p1 a fost transferată către pointer. p2 folosind semantica mutarii.