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.
Übersicht über die Smartpointer
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.
- shared ownership
Mehrere Smartpointer können (gleichberechtigt) auf dasselbe Objekt zeigen.
- transfer of ownership
Nur ein einziger Smartpointer kann auf das Objekt zeigen. Wird ein zweiter Smartpointer mit demselben Objekt initialisiert, so
gehen die Besitzrechte vollständig auf diesen über und der erste Smartpointer zeigt auf NULL.
|
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 |
- Vollständige Abgabe der Kontrolle an den Smartpointer
Ein Smartpointer sollte immer durch das Statement smart_ptr<Test> sp( new Xxx() ); initialisiert werden.
(d.h. es gibt keinen Rawpointer im Code, der auf das Objekt zeigt)
- transfer of ownership
Ein Entwurf ohne Sharing ist, wenn möglich, einem Entwurf mit Sharing vorzuziehen.