logo

Unique_ptr i C++

std::unique_ptr är en smart pekare som introduceras i C++11. Den hanterar automatiskt de dynamiskt allokerade resurserna på högen. Smarta pekare är bara omslag runt vanliga gamla pekare som hjälper dig att förhindra utbredda buggar. Nämligen att glömma att radera en pekare och orsaka en minnesläcka eller av misstag radera en pekare två gånger eller på fel sätt. De kan användas på liknande sätt som standardpekare. De automatiserar några av de manuella processer som orsakar vanliga buggar.

Förutsättningar: Pekare i C++ , Smarta pekare i C++.



Syntax

unique_ptr<  A>ptr1 (nytt A )>

Här,

Vad händer när unique_ptr används?

När vi skriver unika_ptr ptr1 (nytt A), minne tilldelas på högen för en instans av datatyp A. ptr1 initieras och pekar på nyskapat A-objekt. Här är ptr1 den enda ägaren till det nyskapade objektet A och det hanterar detta objekts livstid. Detta betyder att när ptr1 återställs eller går utanför räckvidden, avallokeras minnet automatiskt och A:s objekt förstörs.

När ska man använda unique_ptr?

När ägande av resurs krävs. När vi vill ha ett enda eller exklusivt ägande av en resurs, då bör vi gå efter unika tips. Endast en unik pekare kan peka på en resurs. Så en unik pekare kan inte kopieras till en annan. Dessutom underlättar det automatisk rensning när dynamiskt allokerade objekt går utanför räckvidden och hjälper till att förhindra minnesläckor.



Obs: Vi måste använda header-fil för att använda dessa smarta pekare.

Exempel på Unique_ptr

Exempel 1:

Låt oss skapa en struktur A och den kommer att ha en metod som heter printA för att visa lite text. Låt oss sedan i huvudsektionen skapa en unik pekare som pekar på strukturen A. Så vid denna tidpunkt har vi en instans av struktur A och p1 håller pekaren till den.

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;> }>

abstrakt klass vs gränssnitt

>

java oops koncept
>

Produktion

A struct.... 0x18dac20>

Exempel 2

Låt oss nu skapa en annan pekare p2 och vi kommer att försöka kopiera pekaren p1 med tilldelningsoperatorn (=).

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;> > >// will give compile time error> >unique_ptr> p2 = p1;> >p2->printA();> >return> 0;> }>

>

>

Produktion

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;  | ^~~~~~~~~~>

Ovanstående kod kommer att ge kompileringstidsfel eftersom vi inte kan tilldela pekaren p2 till p1 i händelse av unika pekare. Vi måste använda rörelsesemantiken för sådana ändamål som visas nedan.

fjäderstövel

Exempel 3

Hantera objekt av typ A med hjälp av rörelsesemantik.

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

>

>

Produktion

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

Observera att när adressen i pekaren p1 har kopierats till pekaren p2, blir pekaren p1:s adress NULL(0) och adressen som lagras av p2 är nu densamma som adressen lagrad av p1, vilket visar att adressen i p1 har överförts till pekaren p2 med hjälp av rörelsesemantiken.