Heim > Artikel > Backend-Entwicklung > Entdecken Sie intelligente Zeiger in C++
Intelligente Zeiger sind ein sehr wichtiges Konzept in C++. Ihre Aufgabe besteht darin, Programmierern dabei zu helfen, Speicherlecks zu verhindern und gleichzeitig eine bequemere und flexiblere Speicherverwaltungsmethode bereitzustellen. In diesem Artikel werden die Konzepte, Typen und Verwendung intelligenter Zeiger ausführlich untersucht.
Smart Pointer sind eine moderne C++-Speicherverwaltungstechnologie, die Zeiger speichert, die die Speicherzuweisung und -freigabe in Smart Pointer-Objekten kapseln. Da die C++-Sprache den Speicher für Programmierer nicht automatisch verwaltet und Programmierer häufig vergessen, Speicher freizugeben, kann die Verwendung intelligenter Zeiger die Möglichkeit dieser Probleme erheblich reduzieren.
Ein weiterer Vorteil von Smart Pointern besteht darin, dass sie die Wartbarkeit von Programmen verbessern können, da sie die Speicherfreigabe und die Verwaltung des Objektlebenszyklus vom Programmierer in die Smart Pointer-Bibliothek verlagern. In modernem C++ ist Code, der intelligente Zeiger verwendet, tendenziell robuster und weniger fehleranfällig als Code, der Rohzeiger verwendet.
In C++ gibt es drei Arten von Smart Pointern: unique_ptr, shared_ptr und schwach_ptr. Sie sind alle in der Standard-Header-Datei
(1) unique_ptr
unique_ptr ist ein exklusiver Zeiger, der sicherstellt, dass immer nur ein intelligenter Zeiger auf ein Objekt zeigen kann. Mit anderen Worten: unique_ptr verbietet mehrere Zeiger, die auf dasselbe Objekt zeigen. Wenn Sie einen unique_ptr-Zeiger auf einen anderen Smart-Zeiger übertragen möchten, müssen Sie die Funktion std::move() verwenden.
Das Folgende ist ein Beispielcode, der die grundlegende Verwendung von unique_ptr demonstriert:
std::unique_ptr<int> up(new int(10)); // 声明unique_ptr指针,并分配一个int类型的动态内存区域 std::cout << *up << std::endl; // 输出10 *up = 20; // 修改动态内存中的值 std::cout << *up << std::endl; // 输出20
Es ist zu beachten, dass der dynamische Speicher, auf den er verweist, automatisch freigegeben wird, wenn der unique_ptr-Zeiger seinen Gültigkeitsbereich verlässt. (Auch wenn eine Ausnahme ausgelöst wird)
(2) shared_ptr
shared_ptr kann dasselbe Objekt mit mehreren Zeigern teilen, und Sie können die Funktion use_count() verwenden, um die Anzahl der Zeiger zu ermitteln, die auf dasselbe Objekt zeigen. Da mehrere Zeiger auf dasselbe Objekt verweisen können, muss darauf geachtet werden, Situationen mit Zirkelverweisen zu vermeiden, die zu Speicherverlusten führen können.
Die Verwendung des Beispielcodes lautet wie folgt:
std::shared_ptr<int> sp1(new int(10)); std::shared_ptr<int> sp2 = sp1; std::cout << *sp1 << std::endl; // 输出10 std::cout << *sp2 << std::endl; // 输出10 std::cout << sp1.use_count() << std::endl; // 输出2
Es ist zu beachten, dass sich der Referenzzähler im Speicherbereich jedes Mal um 1 erhöht, wenn ein neuer shared_ptr-Zeiger auf denselben Speicherbereich zeigt. Wenn ein Zeiger seinen Gültigkeitsbereich verlässt, wird der Referenzzähler ebenfalls entsprechend dekrementiert. Der Speicher wird erst freigegeben, wenn der Referenzzähler 0 erreicht. (Auch wenn eine Ausnahme ausgelöst wird)
(3) schwacher_ptr
weak_ptr ist eine schlankere Version von shared_ptr. Es kann das Objekt, auf das gezeigt wird, nicht steuern und muss vor der Verwendung in shared_ptr konvertiert werden. Da es keinen Einfluss auf die Referenzzählung hat, verursacht es keine Speicherverluste. Beachten Sie jedoch, dass Sie bei der Verwendung von schwach_ptr sicherstellen müssen, dass das Objekt, auf das gezeigt wird, vorhanden ist. Andernfalls führt die Verwendung der bereitgestellten Schnittstelle zu einem Programmfehler.
Hier ist ein Beispiel für die Verwendung von schwachem_ptr:
std::shared_ptr<int> sp1(new int(10)); std::weak_ptr<int> wp = sp1; std::cout << *wp.lock() << std::endl; // 使用weak_ptr提供的lock()函数将其转化为shared_ptr,并访问内存中的值 std::cout << wp.use_count() << std::endl; // 输出1
Es ist zu beachten, dass beim Löschen des verwiesenen Objekts der von schwach_ptr.lock() zurückgegebene shared_ptr leer ist.
Die Verwendung von Smart Pointern kann die Aufgabe der Speicherverwaltung erheblich vereinfachen, da sie den von ihnen verwalteten dynamischen Speicher automatisch freigeben können. Wenn Sie einen intelligenten Zeiger verwenden, muss dieser mit einem Rückgabewert für die dynamische Speicherzuweisung initialisiert werden. Nachfolgend finden Sie einige Beispielcodes, die den Lesern helfen sollen, die Verwendung von Smart Pointern besser zu verstehen.
// 使用unique_ptr std::unique_ptr<int> up(new int(10)); std::unique_ptr<float[]> u_arr( new float[5] ); // 对数组使用unique_ptr // 使用shared_ptr std::shared_ptr<int> sp(new int(10)); std::shared_ptr<double> sp_arr(new double[5], [](double* p){ delete[] p; }); // 对数组使用shared_ptr,并在内部传递匿名的lambda表达式释放动态内存 std::shared_ptr<Base> spb = std::make_shared<Base>(); // 使用std::make_shared创建shared_ptr指针 std::shared_ptr<Derived> spd = std::make_shared<Derived>(); // 使用weak_ptr std::weak_ptr<int> wp; if (auto sp = wp.lock()) // 使用wp.lock()检查指向的对象 { // 操作所指向的对象 } else { // 找不到所指向的对象 }
Es ist zu beachten, dass, wenn ein gewöhnlicher Zeiger und ein intelligenter Zeiger verwendet werden, um auf denselben dynamischen Speicher zu zeigen, der intelligente Zeiger vor dem gewöhnlichen Zeiger zerstört wird, was leicht dazu führen kann, dass der gewöhnliche Zeiger auf einen freigegebenen zeigt ( (unbrauchbarer) Speicherplatz.
Intelligente Zeiger sind eine sehr nützliche C++-Speicherverwaltungsmethode. Sie können Speicherlecks bis zu einem gewissen Grad verhindern und auch die Wartbarkeit des Programms verbessern. In Standards nach C++11 werden Smart Pointer als bevorzugte Methode der Speicherverwaltung empfohlen. Im eigentlichen Entwicklungsprozess müssen Sie entsprechend der jeweiligen Situation auswählen, welche Art von Smart Pointer verwendet werden soll, um den besten Speicherverwaltungseffekt zu erzielen.
Das obige ist der detaillierte Inhalt vonEntdecken Sie intelligente Zeiger in C++. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!