Heim  >  Artikel  >  Backend-Entwicklung  >  C++-Smartpointer: eine umfassende Analyse ihres Lebenszyklus

C++-Smartpointer: eine umfassende Analyse ihres Lebenszyklus

WBOY
WBOYOriginal
2024-05-09 11:06:02685Durchsuche

C++-Smart-Pointer-Lebenszyklus: Erstellung: Erstellen Sie einen Smart-Pointer, wenn Speicher zugewiesen wird. Eigentumsübertragung: Übertragen Sie das Eigentum durch einen Umzugsvorgang. Freigabe: Speicher wird freigegeben, wenn ein Smart Pointer den Gültigkeitsbereich verlässt oder explizit freigegeben wird. Objektzerstörung: Wenn das Objekt, auf das gezeigt wird, zerstört wird, wird der intelligente Zeiger zu einem ungültigen Zeiger.

C++ 智能指针:全面剖析其生命周期

C++ Smart Pointer: Umfassende Analyse seines Lebenszyklus

Einführung

Ein Smart Pointer ist ein spezieller Zeiger in C++, der zur Verwaltung von dynamisch zugewiesenem Speicher verwendet wird. Im Gegensatz zu Rohzeigern sind intelligente Zeiger dafür verantwortlich, den Speicherstatus des Objekts, auf das sie zeigen, zu verfolgen und diesen Speicher automatisch freizugeben, wenn das Objekt nicht mehr benötigt wird. Dies trägt dazu bei, häufige Programmierfehler wie Speicherverluste und fehlende Zeiger zu vermeiden.

Typen

Die C++-Standardbibliothek bietet vier Haupttypen von intelligenten Zeigern:

  • unique_ptr8742468051c85b06f0a0af9e3e506b5c: Eindeutiger Zeiger. Es kann jeweils nur ein unique_ptr auf ein Objekt verweisen.
  • shared_ptr8742468051c85b06f0a0af9e3e506b5c: Zeiger auf geteilten Besitz. Es können mehrere shared_ptr vorhanden sein, die auf dasselbe Objekt verweisen.
  • weak_ptr8742468051c85b06f0a0af9e3e506b5c: Schwacher Referenzzeiger. schwach_ptr verhindert nicht die Zerstörung des Objekts und muss in Verbindung mit shared_ptr verwendet werden.
  • auto_ptr8742468051c85b06f0a0af9e3e506b5c: Verlassen. In C++11 entfernt.

Lebenszyklus

1. Intelligente Zeiger können erstellt werden, wenn das Objekt Speicher zuweist, genau wie bei der Verwendung von Rohzeigern:

auto ptr = std::make_unique<int>(42);

2. Eigentumsübertragung

Intelligente Zeiger können verschoben werden durch ( move)-Vorgang überträgt den Besitz:

auto ptr2 = std::move(ptr);  // ptr2 现在拥有对整数对象的唯一所有权

3. Release

Wenn ein Smart Pointer seinen Gültigkeitsbereich verlässt oder explizit freigegeben wird, gibt er den Speicher frei, den er besitzt:

{
    auto ptr = std::make_unique<int>(42);
    // ...
}  // ptr 在此处释放

4 Wenn das Objekt zerstört wird, wird der Smart Pointer zu einem ungültigen Zeiger:

int* ptr = new int(42);
auto sptr = std::make_shared<int>(ptr);
delete ptr;  // ptr 被销毁
sptr->get();  // sptr 现在指向一个无效指针,因此 get() 会抛出异常

Praktischer Fall

So verwenden Sie Smart Pointer zum Verwalten dynamisch zugewiesener Arrays:

// 原始指针版本
int* arr = new int[10];  // 分配数组

// ...

delete[] arr;  // 释放数组

// 智能指针版本
std::unique_ptr<int[]> arr = std::make_unique<int[]>(10);  // 分配数组

// ...

// arr 在离开范围时自动释放

Die Smart Pointer-Version ist sicherer, weil sie verhindert Speicherlecks und baumelnde Zeiger.

Das obige ist der detaillierte Inhalt vonC++-Smartpointer: eine umfassende Analyse ihres Lebenszyklus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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