logo

Unique_ptr en C++

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í,

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();>>> return> 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 << p1.get() << endl;> >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.