Heim > Backend-Entwicklung > C++ > Hauptteil

Intelligente C++-Zeiger: Die Entwicklung von Zeigern, eine gute Lösung für Speicherprobleme

WBOY
Freigeben: 2024-05-09 11:09:02
Original
353 Leute haben es durchsucht

Smart Pointer sind Tools in C++, die Speicherverwaltungsprobleme lösen, indem sie die Speicherfreigabe automatisch verwalten. Häufig verwendete Smart-Pointer-Typen sind: unique_ptr: exklusiver Besitz, der das angezeigte Objekt freigibt, wenn es zerstört wird. shared_ptr: Gemeinsamer Besitz, Referenzzählung verfolgt die Anzahl der Zeiger und das Objekt wird freigegeben, wenn der letzte Zeiger zerstört wird. schwacher_ptr: Eine schwache Referenz verlängert den Objektlebenszyklus nicht und kann nur in Kombination mit shared_ptr verwendet werden.

C++ 智能指针:指针的进化,解决内存问题的良药

C++ Smart Pointer: Die Entwicklung von Zeigern, eine gute Lösung für Speicherprobleme

Smart Pointer sind leistungsstarke Tools in C++, die bei der Lösung von Problemen wie Speicherlecks und wilden Zeigern helfen, indem sie die Speicherfreigabe automatisch verwalten. Im Vergleich zu herkömmlichen Zeigern sind intelligente Zeiger sicherer und effizienter, sodass sich Programmierer auf das Schreiben von Geschäftslogik konzentrieren können, ohne sich um die mühsamen Details der Speicherverwaltung kümmern zu müssen.

Mehrere gängige intelligente Zeiger

unique_ptr

  • exklusiver Besitz, der nur auf ein Objekt zeigt.
  • Wenn unique_ptr zerstört wird, wird auch das Objekt zerstört, auf das es zeigt.

shared_ptr

  • Gemeinsamer Besitz, sodass mehrere Objekte auf denselben Speicherblock verweisen können.
  • Der Referenzzähler verfolgt die Anzahl der Zeiger. Wenn der letzte shared_ptr zerstört wird, wird das Objekt, auf das gezeigt wird, zerstört.

weak_ptr

  • Eine schwache Referenz verlängert nicht den Lebenszyklus des spitzen Objekts.
  • Kann nur in Kombination mit shared_ptr verwendet werden. Wenn der letzte shared_ptr zerstört wird, wird schwacher_ptr auf ungültig gesetzt.

Praktischer Fall

Angenommen, wir haben eine Person-Klasse, die eine Person darstellt. Unser Ziel ist es, einen Vektor zu erstellen, der Person-Objekte speichert und sicherstellt, dass der Speicher automatisch freigegeben wird, wenn der Vektor den Gültigkeitsbereich verlässt. Person 类,它表示一个人。我们的目标是创建一个存储 Person 对象的向量,并确保当向量超出了作用域时,内存会被自动释放。

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

class Person {
public:
    Person(const std::string& name) : name(name) {}
    ~Person() { std::cout << "Destructor called for " << name << std::endl; }

private:
    std::string name;
};

int main() {
    std::vector<std::shared_ptr<Person>> people;

    // 添加几个 Person 对象
    people.push_back(std::make_shared<Person>("John"));
    people.push_back(std::make_shared<Person>("Mary"));
    people.push_back(std::make_shared<Person>("Bob"));

    // 遍历并打印名称
    for (const auto& person : people) {
        std::cout << person->name << std::endl;
    }

    return 0;
}
Nach dem Login kopieren

输出:

John
Mary
Bob
Destructor called for John
Destructor called for Mary
Destructor called for Bob
Nach dem Login kopieren

在示例中,我们使用 std::shared_ptr<Person> 来存储 Person 对象的指针。当 people 向量超出作用域销毁时,智能指针也会随之销毁。这将自动释放 Personrrreee

Ausgabe: 🎜rrreee🎜Im Beispiel verwenden wir std::shared_ptr<Person>, um den Zeiger des Person-Objekts zu speichern. Wenn der people-Vektor außerhalb des Gültigkeitsbereichs zerstört wird, wird auch der Smart Pointer zerstört. Dadurch wird der vom Person-Objekt belegte Speicher automatisch freigegeben und Speicherlecks verhindert. 🎜

Das obige ist der detaillierte Inhalt vonIntelligente C++-Zeiger: Die Entwicklung von Zeigern, eine gute Lösung für Speicherprobleme. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage