namespace cpp

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


kennen:lib:unique_ptr

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

kennen:lib:unique_ptr [2017-03-24 09:29] (aktuell)
Zeile 1: Zeile 1:
 +====== unique_ptr<​T,​ Deleter> ======
 +''#​include''​ [[..:​include:​memory]]
  
 +Intelligenter Zeiger mit Verschiebesemantik.
 +
 +===== Methoden =====
 +| ''​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 [[../​keywords#​delete]].
 +Als ''​Deleter''​ kann auch ein Funktionsobjekt oder Funktionszeiger angegeben werden.
 +
 +===== Siehe auch =====
 + ​[[.:​shared_ptr|shared_ptr<​T>​]].
 +
 +===== Beispiel =====
 +<code cpp unique_ptr.cpp>​
 +#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
 +}
 +</​code>​
 +
 +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:
 +
 +<code cpp make_unique.cpp>​
 +#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;
 +}
 +
 +</​code>​
kennen/lib/unique_ptr.txt · Zuletzt geändert: 2017-03-24 09:29 (Externe Bearbeitung)