std::unique_ptr és un punter intel·ligent introduït a C++11. Gestiona automàticament els recursos assignats dinàmicament a la pila. Els punters intel·ligents són només embolcalls al voltant de punters antics habituals que us ajuden a prevenir errors generalitzats. És a dir, oblidar-se d'eliminar un punter i provocar una fuga de memòria o esborrar accidentalment un punter dues vegades o de manera incorrecta. Es poden utilitzar de manera similar als punters estàndard. Automatitzen alguns dels processos manuals que causen errors comuns.
Requisits previs: Apuntador en C++ , Punters intel·ligents en C++.
Sintaxi
unique_ptr< A>ptr1 (nou A )>>>Aquí,
- unique_ptr : Especifica el tipus de std::unique_ptr. En aquest cas, un objecte de tipus A.
- nou A : un objecte de tipus A s'assigna dinàmicament a l'heap mitjançant l'operador new.
- ptr1 : Aquest és el nom de la variable std::unique_ptr.
Què passa quan s'utilitza unique_ptr?
Quan escrivim unique_ptr ptr1 (nou A), la memòria s'assigna a l'emmagatzematge dinàmic per a una instància del tipus de dades A. ptr1 s'inicializa i apunta a l'objecte A acabat de crear. Aquí, ptr1 és l'únic propietari de l'objecte A recent creat i gestiona la vida útil d'aquest objecte. Això significa que quan ptr1 es restableix o surt de l'abast, la memòria es desassigna automàticament i l'objecte d'A es destrueix.
Quan utilitzar unique_ptr?
Quan es requereix la propietat del recurs. Quan volem la propietat única o exclusiva d'un recurs, hauríem de buscar indicacions úniques. Només un punter únic pot apuntar a un recurs. Per tant, un punter únic no es pot copiar a un altre. A més, facilita la neteja automàtica quan els objectes assignats dinàmicament surten de l'abast i ajuda a prevenir les fuites de memòria.
Nota: hem d'utilitzar fitxer de capçalera per utilitzar aquests punters intel·ligents.
Exemples de Unique_ptr
Exemple 1:
Creem una estructura A i tindrà un mètode anomenat printA per mostrar una mica de text. Llavors, a la secció principal, creem un punter únic que apuntarà a l'estructura A. Així, en aquest punt, tenim una instància de l'estructura A i p1 manté el punter a aquesta.
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->imprimirA();>>> // displays address of the containing pointer> >cout << p1.get() << endl;> >return> 0;> }> |
llista de matrius
>Sortida
A struct.... 0x18dac20>
Exemple 2
Ara creem un altre punter p2 i intentarem copiar el punter p1 utilitzant l'operador d'assignació (=).
C++
fonts per a gimp
// 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->imprimirA();>>> // displays address of the containing pointer> >cout << p1.get() << endl;> > >// will give compile time error> >unique_ptr> p2 = p1;> >p2->imprimirA();>>> 0;> }> |
>
>
Sortida
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; | ^~~~~~~~~~>
El codi anterior donarà un error de compilació, ja que no podem assignar el punter p2 a p1 en cas de punters únics. Hem d'utilitzar la semàntica de moviment per a aquest propòsit, tal com es mostra a continuació.
python desa json al fitxer
Exemple 3
Gestió d'objectes de tipus A mitjançant la semàntica de moviment.
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->imprimirA();>>> // 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->imprimirA();>>> >cout << p2.get() << endl;> >return> 0;> }> |
>
>Sortida
A struct.... 0x2018c20 A struct.... 0 0x2018c20>
Tingueu en compte que una vegada que l'adreça del punter p1 es copia al punter p2, l'adreça del punter p1 es converteix en NULL(0) i l'adreça emmagatzemada per p2 és ara la mateixa que l'adreça emmagatzemada per p1, mostrant que l'adreça de p1 s'ha transferit al punter. p2 utilitzant la semàntica del moviment.