Inhaltsverzeichnis

shared_ptr<T>

#include <memory>

Besitzverwaltender, referenzzählender intelligenter Zeiger auf dynamisches Objekte mit Basistyp T.

Methoden

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.

Siehe auch

unique_ptr<T>, weak_ptr<T>.

Beispiel

shared_ptr.cpp
#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';
}

"Schielender" Zeiger

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:

aliasing_shared_ptr.cpp
#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';
}