Advanced Services | Scopedpointer |
scoped_ptr ist ein Smartpointer aus der boost library, der nicht in den C++11 Standard übernommen wurde. Da er sehr leicht zu verwenden ist, lohnt sich ein Blick auf ihn. Bei einem scoped_ptr gibt es weder ein "transfer of ownership" noch können mehrere scoped_ptr auf ein und dasselbe Objekt zeigen. Will man aber in einem Block sicherstellen, daß mit new geholter Speicher automatisch wieder freigegeben wird, so ist scoped_ptr eine gute Wahl. Wie bei allen Smartpointer gibt es eine Memberfunktion get(), die den originalen Pointer liefert. Zudem verfügt scoped_ptr auch über eine swap()-Funktion, mit der man die Inhalte zweier Pointer vertauschen kann.
Es folgen einige Beispiele. Um den Destruktoraufruf zu verfolgen verwenden wir die folgende kleine Testklasse.
class Test { public: int i; Test(int j = 0) : i(j) {} ~Test() { cout << "destructor test i = " << i << endl; } };
Im folgenden werden zwei scoped_ptr in zwei verschiedenen Blöcken angelegt.
#include <boost/smart_ptr/scoped_ptr.hpp> void scopedPointer1() { cout << "boost::scoped_ptr" << endl; cout << "creating two scoped pointers in nested blocks\n" << endl; boost::scoped_ptr<Test> scop1(new Test()); scop1->i = 17; cout << "scop1 points to " << (*scop1).i << endl; cout << "address scop1 is " << scop1.get() << endl; cout << " enter new block" << endl; { boost::scoped_ptr<Test> scop2(new Test()); scop2->i = 42; cout << " scop2 points to " << (*scop2).i << endl; cout << " address scop2 is " << scop2.get() << endl; cout << " end block" << endl << " "; } cout << "end function" << endl; }
Die Ausgabe
Demonstration der swap-Funktion
void scopedPointer_swap() { cout << "boost::scoped_ptr" << endl; cout << "swapping two scoped pointers\n" << endl; boost::scoped_ptr<Test> scop1(new Test()); boost::scoped_ptr<Test> scop2(new Test()); scop1->i = 17; scop2->i = 42; cout << "scop1 points to " << (*scop1).i << endl; cout << "address scop1 is " << scop1.get() << endl; cout << "scop2 points to " << (*scop2).i << endl; cout << "address scop2 is " << scop2.get() << endl; cout << "\nswapping scop1 and scop2\n" << endl; scop2.swap(scop1); cout << "scop1 points now to " << (*scop1).i << endl; cout << "address scop1 is now " << scop1.get() << endl; cout << "scop2 points now to " << (*scop2).i << endl; cout << "address scop2 is now " << scop2.get() << endl; cout << "\nend function" << endl; }
Die Ausgabe
Initialisiert man einen scoped_ptr mit NULL, so liefert die Memberfunktion get() einen Compilerfehler. Auch beim Versuch den Zuweisungsoperator oder den Kopierkonstruktor zu verwenden kommt es zu einem Compilerfehler. Ebenso wird die Übergabe eine bereits initialisierten Pointers an den Konstruktor vom Compiler verweigert.