boost::scoped_ptr
ist ein Smartpointer, der alleiniger Eigentümer eines dynamisch reservierten Objekts ist. boost::scoped_ptr
kann weder kopiert noch verschoben werden. Der Smartpointer ist in der Headerdatei boost/scoped_ptr.hpp
definiert.
boost::scoped_ptr
in Aktion#include <boost/scoped_ptr.hpp>
#include <iostream>
int main()
{
boost::scoped_ptr<int> p{new int{1}};
std::cout << *p << '\n';
p.reset(new int{2});
std::cout << *p.get() << '\n';
p.reset();
std::cout << std::boolalpha << static_cast<bool>(p) << '\n';
}
Ein Smartpointer vom Typ boost::scoped_ptr
kann das Eigentum an einem Objekt nicht übertragen. Einmal mit einer Adresse initialisiert, wird das dynamisch reservierte Objekte freigegeben, wenn der Destruktor ausgeführt wird oder eine Methode reset()
aufgerufen wird.
Im Beispiel 1.1 wird ein Smartpointer p vom Typ boost::scoped_ptr<int>
verwendet. p wird mit einem Zeiger auf ein dynamisch reserviertes Objekt initialisiert, das die Zahl 1 speichert. Über den Operator operator*
wird p dereferenziert und 1
auf die Standardausgabe ausgegeben.
Mit reset()
kann im Smartpointer eine neue Adresse gespeichert werden. So wird im Beispiel die Adresse eines neuen dynamisch reservierten int
-Objekts mit der Zahl 2 an p übergeben. Beim Aufruf von reset()
wird automatisch das bisher im Smartpointer referenzierte Objekt mit delete
zerstört.
get()
gibt die Adresse des Objekts zurück, auf das der Smartpointer verweist. Im Beispiel wird die Adresse, die von get()
zurückgegeben wird, dereferenziert und 2
in die Standardausgabe geschrieben.
boost::scoped_ptr
überlädt den Operator operator bool
. operator bool
gibt true
zurück, wenn der Smartpointer eine Referenz auf ein Objekt besitzt – also nicht leer ist. Das Beispiel gibt entsprechend false
aus, da p durch einen Aufruf von reset()
zurückgesetzt wurde.
Im Destruktor von boost::scoped_ptr
wird das referenzierte Objekt mit delete
freigegeben. Daher dürfen Sie boost::scoped_ptr
nicht mit der Adresse eines dynamisch reservierten Arrays initialisieren – dieses muss mit delete[]
freigegeben werden. Für Arrays bietet Boost.SmartPointers die Klasse boost::scoped_array
an.
boost::scoped_array
in Aktion#include <boost/scoped_array.hpp>
int main()
{
boost::scoped_array<int> p{new int[2]};
*p.get() = 1;
p[1] = 2;
p.reset(new int[3]);
}
Der Smartpointer boost::scoped_array
wird wie boost::scoped_ptr
verwendet. Der entscheidende Unterschied ist, dass der Destruktor von boost::scoped_array
dynamisch reservierten Speicher mit delete[]
freigibt. Da ausschließlich Arrays mit delete[]
freigegeben werden, müssen Sie boost::scoped_array
mit der Adresse eines dynamisch reservierten Arrays initialisieren.
boost::scoped_array
ist in der Headerdatei boost/scoped_array.hpp
definiert.
boost::scoped_array
überlädt die beiden Operatoren operator[]
und operator bool
. Über operator[]
können Sie direkt auf eine Position im Array zugreifen – ein Objekt vom Typ boost::scoped_array
verhält sich wie das Array, dessen Adresse es speichert. So wird im Beispiel 1.2 die Zahl 2 als zweites Element im Array gespeichert, auf das p verweist.
Wie bei boost::scoped_ptr
stehen ebenfalls die beiden Methoden get()
und reset()
zur Verfügung, mit denen die im boost::scoped_array
gespeicherte Adresse abgerufen und neu gesetzt werden kann.