logo

Unique_ptr i C++

std::unique_ptr er en smart peker introdusert i C++11. Den administrerer automatisk de dynamisk tildelte ressursene på haugen. Smarte pekere er bare omslag rundt vanlige gamle pekere som hjelper deg med å forhindre utbredte feil. Nemlig å glemme å slette en peker og forårsake en minnelekkasje eller ved et uhell slette en peker to ganger eller på feil måte. De kan brukes på samme måte som standardpekere. De automatiserer noen av de manuelle prosessene som forårsaker vanlige feil.

Forutsetninger: Peker i C++ , Smarte pekere i C++.



Syntaks

unique_ptr<  A>ptr1 (ny A )>

Her,

Hva skjer når unique_ptr brukes?

Når vi skriver unike_ptr ptr1 (ny A), minne er allokert på heapen for en forekomst av datatype A. ptr1 initialiseres og peker på nyopprettet A-objekt. Her er ptr1 den eneste eieren av det nyopprettede objektet A, og det administrerer dette objektets levetid. Dette betyr at når ptr1 er tilbakestilt eller går utenfor scope, blir minne automatisk deallokert og As objekt blir ødelagt.

Når skal man bruke unique_ptr?

Når eierskap til ressurs er nødvendig. Når vi ønsker enkelt eller eksklusivt eierskap til en ressurs, bør vi gå for unike tips. Bare én unik peker kan peke til én ressurs. Så en unik peker kan ikke kopieres til en annen. Det letter også automatisk opprydding når dynamisk tildelte objekter går utenfor rekkevidde og bidrar til å forhindre minnelekkasjer.



Merk: Vi må bruke header-fil for bruk av disse smarte pekerne.

Eksempler på Unique_ptr

Eksempel 1:

La oss lage en struktur A og den vil ha en metode som heter printA for å vise litt tekst. Så i hoveddelen, la oss lage en unik peker som vil peke til strukturen A. Så på dette tidspunktet har vi en forekomst av struktur A og p1 holder pekeren til 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;> }>

string.format

>

>

Produksjon

A struct.... 0x18dac20>

Eksempel 2

La oss nå lage en annen peker p2, og vi vil prøve å kopiere pekeren p1 ved å bruke tilordningsoperatoren (=).

C++

kali linux kommandoer




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

>

>

Produksjon

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

Koden ovenfor vil gi kompileringstidsfeil da vi ikke kan tilordne peker p2 til p1 i tilfelle unike pekere. Vi må bruke bevegelsessemantikken til slike formål som vist nedenfor.

analog kommunikasjon

Eksempel 3

Administrere objekt av type A ved hjelp av bevegelsessemantikk.

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

>

>

Produksjon

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

Merk at når adressen i pekeren p1 er kopiert til pekeren p2, blir pekeren p1s adresse NULL(0) og adressen lagret av p2 er nå den samme som adressen lagret av p1, noe som viser at adressen i p1 er overført til pekeren p2 ved å bruke bevegelsessemantikken.