Verwenden von intelligenten Zeigern in C++
-
Verwendung von
std::shared_ptr
für mehrere Zeiger, die auf dasselbe Objekt in C++ verweisen -
Verwendung von
std::unique_ptr
für einen Zeiger auf das gegebene Objekt 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
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