Heim >Backend-Entwicklung >C++ >Kann std::shared_ptr für eine zuverlässige Bereinigung beim Herunterfahren verwendet werden?

Kann std::shared_ptr für eine zuverlässige Bereinigung beim Herunterfahren verwendet werden?

DDD
DDDOriginal
2024-11-03 08:03:30403Durchsuche

Can std::shared_ptr be used for reliable cleanup at shutdown?

std::shared_ptr: Eine unerwartete Funktionalität

std::shared_ptr, eingeführt in C 11, bietet eine Möglichkeit, dynamisch zugewiesene Objekte mit gemeinsamem Besitz zu verwalten. Es ergab sich jedoch ein interessanter Anwendungsfall mit std::shared_ptr, bei dem es für willkürliche Bereinigungen beim Herunterfahren eingesetzt wird. Diese Technik scheint zwar kontraintuitiv zu sein, wirft jedoch grundlegende Fragen zum Verhalten und zur Zuverlässigkeit von std::shared_ptr auf.

Das Arbeitsbeispiel

Bedenken Sie den folgenden Codeausschnitt:

<code class="cpp">#include <memory>
#include <vector>

class Test {
public:
  Test() { std::cout << "Test created" << std::endl; }
  ~Test() { std::cout << "Test destroyed" << std::endl; }
};

int main() {
  std::vector<std::shared_ptr<void>> v;
  {
    v.push_back(std::shared_ptr<Test>(new Test()));
  }
  return 0;
}</code>

Überraschenderweise gibt dieser Code Folgendes aus:

Test created
Test destroyed

Dies deutet darauf hin, dass das Testobjekt ordnungsgemäß zerstört wurde, obwohl es von einem std::shared_ptr gehalten wird.

Der zugrunde liegende Mechanismus

std::shared_ptr sorgt für die Typlöschung und trennt den Typ des verwalteten Objekts von der Implementierung. Intern speichert es eine Löschfunktion, die den entsprechenden Destruktor basierend auf dem Typ des ursprünglichen Objekts aufruft.

Wenn ein std::shared_ptr in ein std::shared_ptr kopiert wird, bleibt die Löschfunktion erhalten. Der gespeicherte Löscher ist in unserem Beispiel für den Aufruf des Testdestruktors verantwortlich.

Standardkonformität und -zuverlässigkeit

Das beschriebene Verhalten funktioniert zwar derzeit, hängt jedoch von Implementierungsdetails ab und ist es auch nicht durch den C-Standard gewährleistet. Dies hat zwei Gründe:

  • Typlöschung: Die Entkopplung des internen Typs von shared_ptr kann zu unerwartetem Verhalten führen, wenn sich die Implementierung in Zukunft ändert.
  • Löschfunktion:Die Implementierung von std::shared_ptr ist nicht verpflichtet, eine Löschfunktion für void* zu implementieren.

Daher ist die Verwendung von std::shared_ptr für willkürliche Bereinigung kann eine riskante Vorgehensweise sein und wird für zuverlässigen Code nicht empfohlen.

Das obige ist der detaillierte Inhalt vonKann std::shared_ptr für eine zuverlässige Bereinigung beim Herunterfahren verwendet werden?. 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