logo

Unieke_ptr in C++

std::unique_ptr is een slimme aanwijzer geïntroduceerd in C++11. Het beheert automatisch de dynamisch toegewezen bronnen op de heap. Slimme aanwijzers zijn slechts wikkels rond gewone oude aanwijzers die u helpen wijdverbreide bugs te voorkomen. Namelijk vergeten een pointer te verwijderen en een geheugenlek te veroorzaken of per ongeluk een pointer twee keer of op de verkeerde manier te verwijderen. Ze kunnen op dezelfde manier worden gebruikt als standaardaanwijzers. Ze automatiseren enkele handmatige processen die veelvoorkomende bugs veroorzaken.

Vereisten: Aanwijzer in C++ , Slimme wijzers in C++.



Syntaxis

unique_ptr<  A>ptr1 (nieuw A)>

Hier,

Wat gebeurt er als unique_ptr wordt gebruikt?

Wanneer we unique_ptr ptr1 (nieuwe A), geheugen wordt toegewezen op de heap voor een exemplaar van gegevenstype A. ptr1 wordt geïnitialiseerd en verwijst naar het nieuw gemaakte A-object. Hier is ptr1 de enige eigenaar van het nieuw gemaakte object A en beheert het de levensduur van dit object. Dit betekent dat wanneer ptr1 wordt gereset of buiten bereik valt, de toewijzing van het geheugen automatisch wordt opgeheven en het object van A wordt vernietigd.

Wanneer moet u unique_ptr gebruiken?

Wanneer eigendom van de hulpbron vereist is. Als we enkelvoudig of exclusief eigendom van een hulpbron willen, moeten we voor unieke aanwijzingen kiezen. Slechts één unieke aanwijzer kan naar één bron verwijzen. De ene unieke pointer kan dus niet naar de andere worden gekopieerd. Het vergemakkelijkt ook automatisch opschonen wanneer dynamisch toegewezen objecten buiten bereik raken en helpt geheugenlekken te voorkomen.



Opmerking: we moeten de header-bestand voor het gebruik van deze slimme pointers.

Voorbeelden van Unique_ptr

Voorbeeld 1:

Laten we een structuur A maken en deze zal een methode hebben met de naam printA om wat tekst weer te geven. Laten we vervolgens in het hoofdgedeelte een unieke aanwijzer maken die naar structuur A verwijst. Dus op dit punt hebben we een instantie van structuur A en p1 houdt de aanwijzer daarnaartoe vast.

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->afdrukkenA();> > >// displays address of the containing pointer> >cout << p1.get() << endl;> >return> 0;> }>

k dichtstbijzijnde buuralgoritme

>

>

Uitvoer

java boolean naar string
A struct.... 0x18dac20>

Voorbeeld 2

Laten we nu nog een pointer p2 maken en we zullen proberen de pointer p1 te kopiëren met behulp van de toewijzingsoperator (=).

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->afdrukkenA();> > >// displays address of the containing pointer> >cout << p1.get() << endl;> > >// will give compile time error> >unique_ptr> p2 = p1;> >p2->afdrukkenA();> >return> 0;> }>

>

>

Uitvoer

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

De bovenstaande code geeft een compileerfout omdat we pointer p2 niet aan p1 kunnen toewijzen in het geval van unieke pointers. We moeten de verplaatsingssemantiek gebruiken voor het doel zoals hieronder weergegeven.

kan een abstracte klasse een constructor hebben?

Voorbeeld 3

Object van type A beheren met behulp van verplaatsingssemantiek.

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

>

>

Uitvoer

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

Merk op dat zodra het adres in pointer p1 is gekopieerd naar pointer p2, het adres van de pointer p1 NULL (0) wordt en het adres opgeslagen door p2 nu hetzelfde is als het adres opgeslagen door p1, wat aangeeft dat het adres in p1 is overgedragen naar de pointer p2 met behulp van de verplaatsingssemantiek.