#include
<memory>
Intelligenter Zeiger mit Verschiebesemantik.
get() | Liefert Zeiger auf verwaltetes Objekt |
release() | Gibt verwaltetes Objekt frei |
reset(T* p) | Gibt verwaltetes Objekt frei und übernimmt Besitz von p |
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> std::unique_ptr<double> source(double d) { return std::make_unique<double>(d); } void sink(std::unique_ptr<double> p) { std::cout << *p << " erhalten.\n"; } int main() { auto p(source(3.1415)); std::cout << *p << " erschaffen\n"; sink(std::move(p)); if (!p) std::cout << "Zeiger freigegeben\n"; sink(source(2.718)); // dynamisches Feld - bevorzuge std::vector<T>, std::array<T,N> int size = 10; std::unique_ptr<int[]> squares(new int[size]); for (int i = 0; i < size; ++i) // Buchhaltung über Anzahl Elemente { // in Verantwortung des Programmierers! squares[i] = i*i; std::cout << squares[i] << ' '; } return 0; // automatische Freigabe }
Die Funktion make_unique<T>(parameter)
als Gegenstück zu make_shared<T>(parameter)
wurde erst im Standard C++14 ergänzt.
In C++11 lässt sie sich aber leicht ergänzen:
#include <memory> #include <iostream> template <class T, class... Args> std::unique_ptr<T> make_unique(Args&&... args) { return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); } int main() { auto p = make_unique<double>(3.1415); std::cout << *p << " erschaffen\n"; return 0; }