Auto ptr
Z Wikipedii
auto_ptr to wzorzec klasy sprytnego wskaźnika dostępny w bibliotece standardowej C++ (zadeklarowany w nagłówku <memory>) udostępniający podstawową funkcjonalność RAII dla zwykłych surowych wskaźników.
Wzorzec klasy auto_ptr opisuje obiekt przechowujący wskaźnik do zaalokowanego obiektu typu Typ*, dbając o to żeby obiekt na który ten wskaźnik wskazuje został automatycznie zniszczony po opuszczeniu zasięgu.
W większości sytuacji preferowany zamiast auto_ptr jest wzorzec shared_ptr proponowany w Technical Report 1 i dostępny w bibliotece Boost.
[edytuj] Deklaracja
Klasa auto_ptr jest deklarowana w standardzie ISO/IEC 14882, sekcja 20.4.5 jako:
namespace std { template <class Y> struct auto_ptr_ref {}; template<class X> class auto_ptr { public: typedef X element_type; // 20.4.5.1 construct/copy/destroy: explicit auto_ptr(X* p =0) throw(); auto_ptr(auto_ptr&) throw(); template<class Y> auto_ptr(auto_ptr<Y>&) throw(); auto_ptr& operator=(auto_ptr&) throw(); template<class Y> auto_ptr& operator=(auto_ptr<Y>&) throw(); auto_ptr& operator=(auto_ptr_ref<X> r) throw(); ~auto_ptr() throw(); // 20.4.5.2 members: X& operator*() const throw(); X* operator->() const throw(); X* get() const throw(); X* release() throw(); void reset(X* p =0) throw(); // 20.4.5.3 conversions: auto_ptr(auto_ptr_ref<X>) throw(); template<class Y> operator auto_ptr_ref<Y>() throw(); template<class Y> operator auto_ptr<Y>() throw(); }; }
[edytuj] Semantyka
Klasa auto_ptr ma semantykę ścisłej własności co oznacza że instancja auto_ptr jest jedynym właścicielem obiektu na który ona wskazuje. Przy kopiowaniu auto_ptr, źródłowa instancja ustawia się na wartość null. Przykład:
int *i = new int; auto_ptr<int> x(i); auto_ptr<int> y;
y = x;
cout << x.get() << endl; cout << y.get() << endl;
Ten kod wypisze dla pierwszego obiektu auto_ptr adres NULL i inny adres dla drugiego, pokazując, że obiekt źródłowy utracił referencje podczas przypisania (=). Nie powinno się wykonywac operacji delete na źródłowym wskaźniku i, bo zostanie on usunięty przez drugi auto_ptr.
Trzeba zauważyć, że obiekt wskazywany przez auto_ptr jest usuwany przez operator delete; oznacza to że auto_ptr można używać tylko dla wskaźników uzyskanych przez operator new. Wyłącza to wskaźniki zwracane przez malloc/calloc/realloc i operator new[].