Advanced Services | Smartpointer |
Smartpointer sind intelligewnte Pointer, die am Ende der Anforderung den belegten Speicher selbständig löschen. Das Ende einer Anfordeung kann etwa das Verlassen eines Blocks sein oder es gibt einen internen oder externen Zähler, der festhält wieviele Exemplare auf ein Objekt zeigen. Erreicht der Zähler 0, so wird der Pointer freigegeben. Im Gegensatz dazu nennt man nun die herkömmlichen Pointer gerne raw-Pointer. Entscheidet man sich für Smartpointer, sollte man die Verwaltung des des raw-Pointers komplett an den Smartpointer abgeben. Alle Smartpointer haben daher einen Konstruktor, der einen raw-Pointer erhält.
Der erste Smartpointer war der Autopointer. Mit dem neuen C++11 Stanfard wird er deprecated, hauptsächlich deswegen, weil er nicht mit den Containerklassen aus der STL verwendet werden kann.
Includes: <memory> für alle std::xxx_ptr <boost/smart_ptr/intrusive_ptr.hpp> für intrusive_ptr <boost/smart_ptr/scoped_ptr.hpp> für scoped_ptr
Funktion | std::auto_ptr | intrusive_ptr | scoped_ptr | std::shared_ptr | std::unique_ptr | std::weak_ptr |
reset | ja | ja | ja | ja | ja | ja |
get | ja | ja | ja | ja | ja | nein |
operator* | ja | ja | ja | ja | ja | nein |
operator-> | ja | ja | ja | ja | ja | nein |
swap | nein | ja | ja | ja | ja | ja |
operator= | ja | nein | nein | ja | ja | ja |
release | ja | nein | nein | nein | ja | nein |
operator<< | nein | ja | nein | ja | nein | nein |
operator== | nein | ja | nein | ja | ja | nein |
operator!= | nein | ja | nein | ja | ja | nein |
operator< | nein | ja | nein | ja | ja | nein |
operator<= | nein | nein | nein | ja | ja | nein |
operator> | nein | nein | nein | ja | ja | nein |
operator>= | nein | nein | nein | ja | ja | nein |
custom deleter | nein | nein | nein | ja | ja | nein |
custom allocator | nein | nein | nein | ja | ja | nein |
operator[] | nein | nein | nein | nein | ja | nein |
Mit dem Statement smart_ptr<Test> sp( new Xxx() ); ergreift der Smartpointer Besitz (ownership) über den Rawpointer new Xxx(). Es gibt nun zwei Möglichkeiten, wie sich die Besitzverhältnisse ändern, wenn man einen zweiten Smartpointer auf dasselbe Objekt zeigen lassen will.
std::auto_ptr | intrusive_ptr | scoped_ptr | std::shared_ptr | std::unique_ptr | std::weak_ptr | |
ownership | transfers | shares | not applicable | shares | transfers | not applicable |