Treść książki
Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
Jednymztakichwskaźnikówinteligentnychjestunique–ptr,którymodelu-
jewłasnośćwyłączną.Nalistingu26przedstawionopodstawowysposóbjego
użycia.
#include<memory>
structFoundation{
constchar*founder;
};
intmain(){
std::unique–ptr<Foundation>second–foundation{newFoundation{}};❶
//Sposóbdostępudopolafoundertakisam,jakwprzypadkuwskaźników
second–foundation->founder:"Wanda";
}❷
Listing26.Programwykorzystującywskaźnikinteligentnyunique_ptr
ObiektFoundationzostajedynamiczniezaalokowany,auzyskanywskaźnik
Foundation*jestprzekazywanydokonstruktorasecond–foundationzzastosowa-
niemodpowiedniejskładni❶.Zmiennasecond–foundationjesttypuunique–ptr.
TyptenjestpoprostuobiektemRAIIopakowującymdynamicznązmienną
Foundation.Gdyzmiennasecond–foundationzostaniezniszczona❷,usuwana
jestrównieżdynamicznazmiennaFoundation.
Wskaźnikiinteligentneróżniąsięodzwykłych,standardowychwskaźni-
ków,ponieważtedrugiesąpoprostuadresamipamięci.Powodujeto,żemu-
siszsamodzielniezarządzaćpamięciązwiązanąztakimiadresami.Zdrugiej
stronywskaźnikiinteligentneobsługująwszystkienieprzyjemneszczegóły.Po
opakowaniudynamicznegoobiektuwskaźnikieminteligentnymmaszpew-
ność,żepamięćzostanieodpowiedniozwolniona,gdytylkoobiektprzestanie
byćjużpotrzebny.Kompilatorbędzieotymwiedział,ponieważdestruktor
wskaźnikainteligentnegozostaniewywołany,gdyobiektznajdziesiępoza
zakresem.
Semantykaprzenoszenia
Czasamichciałbyśzmodyfikowaćprawowłasnościobiektu.Takasytuacjapo-
jawiasięczęstonaprzykładwprzypadkuużywaniawskaźnikówunique–ptr.
Niemożnaskopiowaćobiektuotypieunique–ptr,ponieważpozniszczeniu
jednejzjegokopiiinnyelementtypuunique–ptrzawierałbyodwołaniedousu-
niętegoobiektu.Abyprzenieśćwłasnośćzjednegounikatowegowskaźnika
nadrugi,używaszwięcsemantykiprzenoszeniaC++,zamiastwykonywać
kopiowanieobiektu.Tęoperacjęzaprezentowanonalistingu27.
WstępdlaprogramistówC
lvii