Verwenden von intelligenten Zeigern in C++

Jinku Hu 12 Oktober 2023
  1. Verwendung von std::shared_ptr für mehrere Zeiger, die auf dasselbe Objekt in C++ verweisen
  2. Verwendung von std::unique_ptr für einen Zeiger auf das gegebene Objekt in C++
Verwenden von intelligenten Zeigern in C++

Dieser Artikel zeigt verschiedene Methoden zur Verwendung intelligenter Zeiger in C++.

Verwendung von std::shared_ptr für mehrere Zeiger, die auf dasselbe Objekt in C++ verweisen

Da die manuelle Verwaltung des dynamischen Speichers für reale Projekte recht schwierig ist und häufig die Hauptursache für die Fehler ist, bietet C++ das Konzept der intelligenten Zeiger als separate Bibliothek. Intelligente Zeiger fungieren im Allgemeinen als reguläre Zeiger und bieten zusätzliche Funktionen, von denen die bekannteste automatisch die spitzen Objekte freigibt. Es gibt zwei Kerntypen von intelligenten Zeigern: shared_ptr und unique_ptr.

Der folgende Beispielcode veranschaulicht die Verwendung des Typs shared_ptr. Beachten Sie, dass shared_ptr normalerweise verwendet wird, wenn das spitze Objekt von anderen gemeinsam genutzten Zeigern referenziert werden soll. Somit hat shared_ptr intern den zugehörigen Zähler, der die Anzahl der Zeiger angibt, die auf dasselbe Objekt zeigen. Mit der Memberfunktion shared_ptr::unique kann ermittelt werden, ob der Zeiger nur einer ist, der auf das aktuelle Objekt verweist. Der Funktionsrückgabetyp ist boolesch und der Wert true bestätigt die ausschließliche Eigentümerschaft des Objekts. Die integrierte Funktion reset ersetzt das aktuelle Objekt durch das als ersten Parameter übergebene Objekt. Das gemeinsam genutzte Objekt wird gelöscht, wenn der letzte auf das Objekt verweisende shared_ptr den Gültigkeitsbereich verlässt.

#include <iostream>
#include <memory>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

int main() {
  std::shared_ptr<string> p(new string("Arbitrary string"));
  std::shared_ptr<string> p2(p);

  cout << "p : " << p << endl;
  cout << "p2: " << p2 << endl;

  if (!p.unique()) {
    p.reset(new string(*p));
  }
  cout << "p : " << p << endl;

  *p += " modified";
  cout << "*p : " << *p << endl;
  cout << "*p2 : " << *p2 << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

p : 0x2272c20
p2: 0x2272c20
p : 0x2273ca0
*p : Arbitrary string modified
*p2 : Arbitrary string

Verwendung von std::unique_ptr für einen Zeiger auf das gegebene Objekt in C++

Alternativ stellt C++ den Typ unique_ptr bereit, der der alleinige Eigentümer des Objekts ist. Kein anderer Zeiger unique_ptr kann darauf verweisen. unique_ptr unterstützt keine normalen Kopier- und Zuweisungsvorgänge. Trotzdem kann der Objektbesitz mithilfe der integrierten Funktionen release und reset zwischen zwei Zeigern unique_ptr übertragen werden. Der Funktionsaufruf release macht den Zeiger unique_ptr null. Sobald der Befehl unique_ptr freigegeben ist, kann die Funktion reset aufgerufen werden, um ihm einen neuen Objektbesitz zuzuweisen.

#include <iostream>
#include <memory>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

int main() {
  std::unique_ptr<string> p1(new string("Arbitrary string 2"));

  std::unique_ptr<string> p3(p1.release());

  cout << "*p3 : " << *p3 << endl;
  cout << "p3 : " << p3 << endl;
  cout << "p1 : " << p1 << endl;

  std::unique_ptr<string> p4(new string("Arbitrary string 3"));

  p3.reset(p4.release());
  cout << "*p3 : " << *p3 << endl;
  cout << "p3 : " << p3 << endl;
  cout << "p4 : " << p4 << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

*p3 : Arbitrary string 2
p3 : 0x7d4c20
p1 : 0
*p3 : Arbitrary string 3
p3 : 0x7d5c80
p4 : 0
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - C++ Pointer