logo

Unikālais_ptr programmā C++

std::unique_ptr ir viedais rādītājs, kas ieviests programmā C++11. Tas automātiski pārvalda kaudzē dinamiski piešķirtos resursus. Viedās norādes ir tikai iesaiņojumi ap parastajiem vecajiem rādītājiem, kas palīdz novērst plaši izplatītas kļūdas. Proti, aizmirstot dzēst rādītāju un izraisot atmiņas noplūdi vai nejauši izdzēšot rādītāju divreiz vai nepareizā veidā. Tos var izmantot līdzīgi kā standarta norādes. Tie automatizē dažus manuālos procesus, kas izraisa izplatītas kļūdas.

Priekšnosacījumi: Rādītājs programmā C++ , Viedie rādītāji programmā C++.



Sintakse

unique_ptr<  A>ptr1 (jauns A )>

Šeit,

Kas notiek, ja tiek izmantots unikālais_ptr?

Kad mēs rakstām unikālu_ptr ptr1 (jauns A), atmiņa tiek piešķirta kaudzē datu tipa A instancei. ptr1 tiek inicializēts un norāda uz jaunizveidoto A objektu. Šeit ptr1 ir vienīgais jaunizveidotā objekta A īpašnieks, un tas pārvalda šī objekta kalpošanas laiku. Tas nozīmē, ka tad, kad ptr1 tiek atiestatīts vai iziet ārpus darbības jomas, atmiņa tiek automātiski atbrīvota un A objekts tiek iznīcināts.

Kad lietot unikālu_ptr?

Kad ir nepieciešama resursu īpašumtiesības. Ja mēs vēlamies īpašumtiesības uz vienu vai ekskluzīvu resursu, mums vajadzētu izmantot unikālas norādes. Tikai viens unikāls rādītājs var norādīt uz vienu resursu. Tātad vienu unikālu rādītāju nevar pārkopēt uz citu. Tas arī atvieglo automātisku tīrīšanu, kad dinamiski piešķirtie objekti iziet ārpus darbības jomas, un palīdz novērst atmiņas noplūdes.



Piezīme: mums ir jāizmanto galvenes failu šo viedo rādītāju izmantošanai.

Unique_ptr

1. piemērs:

Izveidosim struktūru A, un tai būs metode ar nosaukumu printA, lai parādītu tekstu. Pēc tam galvenajā sadaļā izveidosim unikālu rādītāju, kas norādīs uz struktūru A. Tātad šajā brīdī mums ir struktūras A gadījums, un p1 satur rādītāju uz to.

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

reaģēt-tabula

>

>

Izvade

A struct.... 0x18dac20>

2. piemērs

Tagad izveidosim citu rādītāju p2 un mēģināsim nokopēt rādītāju p1, izmantojot piešķiršanas operatoru (=).

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

Linux arhitektūra
>

>

Izvade

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

Iepriekš minētais kods sniegs kompilēšanas laika kļūdu, jo mēs nevaram piešķirt rādītāju p2 uz p1 unikālu rādītāju gadījumā. Mums ir jāizmanto pārvietošanas semantika šādam nolūkam, kā parādīts zemāk.

python saglabā json failā

3. piemērs

A tipa objekta pārvaldīšana, izmantojot pārvietošanas semantiku.

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

>

>

Izvade

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

Ņemiet vērā, kad rādītāja p1 adrese ir nokopēta uz rādītāju p2, rādītāja p1 adrese kļūst NULL(0) un p2 saglabātā adrese tagad ir tāda pati kā p1 saglabātā adrese, kas parāda, ka adrese no p1 ir pārsūtīta uz rādītāju. p2, izmantojot pārvietošanās semantiku.