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

[editovat] Externí odkazy

V jiných jazycích