blog.garaż.net

12 sierpień 2009

Inteligentne wskaźniki

Inteligentne wskaźniki to bardzo pomocne twory. Dzięki nim nie trzeba pamiętać głównie o zwolnieniu obiektu w różnych przypadkach, a o błędy z tego wynikające nietrudno.

Istnieje masa różnych implementacji inteligentnych wskaźników, od najprostszych usuwających obiekt, na który wskazują w momencie kiedy jest usuwany obiekt wskaźnika lub przypisywana jest nowa wartość, poprzez zliczające, kopiujące i masę innych. Zależnie od funkcji jakie ma spełniać i do jakich celów mamy zamiar go używać każdy może przygotować własną implementację.

Najprostsza wersja może wyglądać tak:

{geshi lang=cpp}template class ptr { private: T m_pointer; ptr(T& pointer) {} T& operator= (ptr& obj) {} public: ptr() : m_pointer(NULL) {} ptr(T pointer) : m_pointer(pointer) {} ~ptr() { delete m_pointer; } T operator-> () { return m_pointer; } T& operator () { return m_pointer; } T& operator= (T pointer) { if (m_pointer != pointer) { delete m_pointer; m_pointer = pointer; } } };{/geshi}

Może nie powala możliwościami, ale na pewno ułatwia pracę w wielu przypadkach. Po rozszerzeniu o kilka dodatkowych funkcji można np. ręcznie unieważniać wskaźnik (wraz z automatycznym usunięciem obiektu), sprawdzać jego poprawność, itd. Wszystko zależy od kreatywności i potrzeb programisty. :)

Więcej wraz z odnośnikami do różnych przykładowych implementacji można znaleźć w tekście Yonata Sharona Smart Pointers - What, Why, Which? lub po prostu googlając. Można także skorzystać z wielu gotowych implementacji dostarczanych przez różne biblioteki (np. Boost).

Comments !