Smart pointer
Z Wikipedie, otevřené encyklopedie
Smart pointer (chytrý ukazatel) je abstraktní datový typ, který poskytuje funkčnost ukazatele, kterou ovšem rozšiřuje o další schopnosti, typicky řízení doby života (automatické uvolňování paměti, garbage collection), zajištění synchronizace při vícevláknovém programování apod.
Klasické ukazatele mají mnoho nepohodlných vlastností a jejich správné užívání je relativně obtížné; často jsou proto zdrojem programátorských chyb. Smart pointery programátora od některých aspektů práce s ukazateli odstiňují a zjednodušují tak jejich používání. Nejběžnějším příkladem chyby při práci s ukazatelem je jeho neuvolnění, kvůli kterému dochází k tzv. úniku paměti (memory leak). Smart pointer se o toto uvolnění stará sám automaticky, zpravidla v okamžiku, kdy smart pointeru končí jeho doba života (k čemuž typicky dojde na konci rozsahu platnosti příslušné proměnné).
V jazycích, které používají automatickou správu paměti pomocí garbage collection, se obvykle smart pointery nepoužívají.
[editovat] Příklad v C++
Jednoduchý příklad porovnávající použití smart pointeru v jazyce C++ (implementovaného třídou auto_ptr
) s obdobou bez smart pointerů:
int funkce_bez_smart_pointeru() { Třída *p = new Třída; // vytvoří instanci třídy v nově alokované paměti p->pracuj(); // používá instanci delete p; // zruší instanci a uvolní paměť } int funkce_se_smart_pointerem() { auto_ptr<Třída> p(new Třída); // novou instanci a její paměť obalí do smart pointeru p->pracuj(); // používá instanci } // před skončením bloku se paměť uvolní automaticky
Je vidět, že při použití smart pointeru není potřeba ukazatel uvolňovat pomocí delete
. Zásadní výhodu však představuje fakt, že v uvedeném příkladu bez použití smart pointeru dojde k úniku paměti v případě, že metoda pracuj
způsobí výjimku, zatímco s použitím smart pointeru k úniku paměti nedojde, neboť i v takovém případě bude objekt správně uvolněn. Odstranění tohoto nedostatku bez použití smart pointerů (či obdobných technik) je poměrně pracné (množstvím kódu, nikoli snad jeho složitostí) a smart pointery zde tedy zřetelně usnadnují práci
[editovat] Podívejte se také na
- Handle
- RAII