meine Kontaktdaten
Postmesophia@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Smart Pointer ist ein Tool in C++, mit dem dynamisch zugewiesener Speicher automatisch verwaltet wird.
Dabei handelt es sich um eine Klasse, die die Funktionen von Rohzeigern kapselt und die Zuweisung und Freigabe von Ressourcen automatisch handhaben kann. Dadurch können Programmierer häufig auftretende Speicherverwaltungsfehler wie Speicherlecks, baumelnde Zeiger und andere Probleme vermeiden.
Intelligente Zeiger funktionieren über den RAII-Mechanismus (Resource Acquisition Is Initialization), was bedeutet, dass intelligente Zeiger Ressourcen erwerben, wenn sie erstellt werden, und Ressourcen freigeben, wenn sie zerstört werden. Dadurch wird sichergestellt, dass Ressourcen auch unter außergewöhnlichen Umständen korrekt freigegeben werden.
(1) Speicherverlust: Der Speicher wird manuell freigegeben, kann jedoch mithilfe intelligenter Zeiger automatisch freigegeben werden.
(2) Weitergabe und Freigabe gemeinsamer Eigentumszeiger, z. B. Zerstörungsprobleme, wenn mehrere Threads dasselbe Objekt verwenden.
Die C++-Standardbibliothek bietet verschiedene Arten von Smart Pointern, darunter:
std::unique_ptr
:
unique_ptr
Eine Instanz hat das ausschließliche Eigentum an dem Objekt, auf das sie verweist.unique_ptr
Wenn es den Gültigkeitsbereich verlässt oder explizit zurückgesetzt wird, ruft es automatisch den Destruktor auf und gibt das verwaltete Objekt frei.std::shared_ptr
:
shared_ptr
Instanzen teilen sich den Besitz desselben Objekts.shared_ptr
Menge.shared_ptr
Wenn eine Instanz den Gültigkeitsbereich verlässt oder zurückgesetzt wird, wird der Referenzzähler auf Null reduziert, der Destruktor des Objekts aufgerufen und das Objekt freigegeben.std::weak_ptr
:
shared_ptr
Zirkelverweisproblem.shared_ptr
verwaltete Objekte, beteiligt sich jedoch nicht an deren Lebenszyklusverwaltung.shared_ptr
Wenn eine Instanz auf ein Objekt zeigt,weak_ptr
Kann erkennen, dass das Objekt zerstört wurde.Der Entwurf und die Verwendung intelligenter Zeiger vereinfacht die Speicherverwaltung in C++ erheblich und verbessert die Robustheit und Sicherheit des Programms. In der modernen C++-Programmierung wird dringend empfohlen, intelligente Zeiger anstelle von Rohzeigern zu verwenden, um die Qualität und Wartbarkeit des Codes zu verbessern.
Intelligente Zeiger werden in C++ als Mittel zur automatischen Verwaltung von dynamisch zugewiesenem Speicher verwendet, um Speicherlecks und andere Probleme im Zusammenhang mit der Ressourcenverwaltung zu verhindern.
std::unique_ptr
Beispielstd::unique_ptr
ist ein intelligenter Zeiger mit exklusivem Besitz, der sicherstellt, dass es nur einen gibtstd::unique_ptr
Eine Instanz hat die Kontrolle über eine bestimmte Ressource.Wannstd::unique_ptr
Wenn es den Gültigkeitsbereich verlässt oder zurückgesetzt wird, werden die Ressourcen, die es besitzt, automatisch freigegeben.
- #include <memory>
-
- class MyClass {
- public:
- MyClass() { std::cout << "MyClass constructor called.n"; }
- ~MyClass() { std::cout << "MyClass destructor called.n"; }
- void doSomething() { std::cout << "Doing something...n"; }
- };
-
- int main() {
- // 创建一个unique_ptr来管理MyClass的实例
- std::unique_ptr<MyClass> uptr(new MyClass());
-
- // 调用doSomething方法
- uptr->doSomething();
-
- // unique_ptr会在离开作用域时自动调用MyClass的析构函数
- return 0;
- }
std::shared_ptr
Beispielstd::shared_ptr
ist ein intelligenter Zeiger mit gemeinsamem Besitz, der mehrere zuläsststd::shared_ptr
Instanzen teilen sich den Besitz derselben Ressource.std::shared_ptr
Verwenden Sie einen Referenzzähler, um zu verfolgen, wie viele intelligente Zeiger auf dieselbe Ressource verweisen. Wenn der Referenzzähler 0 erreicht, wird die Ressource freigegeben.
- #include <memory>
-
- class MyClass {
- public:
- MyClass() { std::cout << "MyClass constructor called.n"; }
- ~MyClass() { std::cout << "MyClass destructor called.n"; }
- void doSomething() { std::cout << "Doing something...n"; }
- };
-
- int main() {
- // 创建一个shared_ptr来管理MyClass的实例
- std::shared_ptr<MyClass> sptr(new MyClass());
-
- // 创建第二个shared_ptr,共享同一个MyClass实例
- std::shared_ptr<MyClass> sptr2 = sptr;
-
- // 调用doSomething方法
- sptr->doSomething();
-
- // 当所有shared_ptr实例都超出作用域时,MyClass的析构函数才会被调用
- return 0;
- }
In Benutzungstd::shared_ptr
Achten Sie dabei darauf, Situationen mit Zirkelverweisen zu vermeiden, die dazu führen, dass der Referenzzähler nie auf 0 sinkt, was zu Ressourcenlecks führt.Bei Zirkelverweisen können Sie verwendenstd::weak_ptr
den Kreislauf durchbrechen,std::weak_ptr
Erhöht den Referenzzähler nicht, sondern speichert nur denstd::shared_ptr
Verwalten Sie schwache Verweise auf Ressourcen.
Diese Beispiele zeigen, wie intelligente Zeiger zum Verwalten von dynamisch zugewiesenem Speicher verwendet werden, um sicherzustellen, dass Ressourcen zum richtigen Zeitpunkt ordnungsgemäß freigegeben werden, und um häufige Fehler zu vermeiden, die bei der manuellen Speicherverwaltung auftreten können.
https://www.cnblogs.com/god-of-death/p/17962676
https://zhuanlan.zhihu.com/p/678722914