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,
- unieke_ptr : Het specificeert het type van de std::unique_ptr. In dit geval een object van type A.
- nieuwe A : Een object van type A wordt dynamisch toegewezen op de heap met behulp van de nieuwe operator.
- ptr1 : Dit is de naam van de std::unique_ptr variabele.
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.