Die Boost C++ Bibliotheken

Alleiniges Eigentum

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.

Beispiel 1.1. 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.

Beispiel 1.2. 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.