Advanced  Services Smartpointer

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

Funktionstd::auto_ptrintrusive_ptrscoped_ptrstd::shared_ptrstd::unique_ptrstd::weak_ptr
resetjajajajajaja
getjajajajajanein
operator*jajajajajanein
operator->jajajajajanein
swapneinjajajajaja
operator=janeinneinjajaja
releasejaneinneinneinjanein
operator<<neinjaneinjaneinnein
operator==neinjaneinjajanein
operator!=neinjaneinjajanein
operator<neinjaneinjajanein
operator<=neinneinneinjajanein
operator>neinneinneinjajanein
operator>=neinneinneinjajanein
custom deleterneinneinneinjajanein
custom allocatorneinneinneinjajanein
operator[]neinneinneinneinjanein

Ownership

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_ptrintrusive_ptrscoped_ptr std::shared_ptrstd::unique_ptrstd::weak_ptr
ownership transfers shares not applicableshares transfers not applicable




design guideline