#include
<memory>
Besitzverwaltender, referenzzählender intelligenter Zeiger auf dynamisches Objekte mit Basistyp T
.
get() | Liefert Zeiger auf verwaltetes Objekt |
release() | Gibt verwaltetes Objekt frei |
reset(T* p) | Gibt verwaltetes Objekt frei und übernimmt Besitz von p |
unique() | Liefert true , wenn einziger Zeiger auf das verwaltete Objekt |
use_oount() | Liefert Anzahl der auf das verwaltete Objekt verweisenden shared_ptr<T> |
Die Freigabe der verwalteten Resource erfolgt durch den automatisierten Aufruf des Operators delete.
Als Deleter
kann auch ein Funktionsobjekt oder Funktionszeiger angegeben werden.
#include <memory> #include <iostream> int main() { auto p = std::make_shared<double>(3.1415); decltype(p) q = p; std::shared_ptr<double> r = q; std::cout << r.use_count() << " Referenzen\n"; *p.get() = 42; // roher Zeiger: &*p if (q) *q = 2.71828; std::cout << *r << '\n'; p = nullptr; std::cout << *r << '\n'; q.reset(); std::cout << *r << '\n'; std::cout << "Einzige Referenz: " << std::boolalpha << r.unique() << '\n'; }
Manchmal benötigt man einen Zeiger auf einen Bestandteil eines dynamisch verwalteten Objekts. Dann kann ein aliasing shared_ptr benutzt werden. Dieser garantiert, dass das dynamische Objekt "am Leben" bleibt:
#include <memory> #include <iostream> #include <utility> int main() { auto p = std::make_shared<std::pair<int,int>>(1, 2); auto py = std::shared_ptr<int>(p, &(p->second)); p = nullptr; std::cout << *py << '\n'; }