Inhaltsverzeichnis

unique_ptr<T, Deleter>

#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 delete. Als Deleter kann auch ein Funktionsobjekt oder Funktionszeiger angegeben werden.

Siehe auch

shared_ptr<T>.

Beispiel

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
}

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:

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;
}