Warum ref_count in shared_ptr Implementierung ist int *

8

Ich habe mehrere Implementierungen von shared_ptr gesehen, zum Beispiel hier . Alle erklären ref_count als int* . Ich verstehe nicht, was wir verlieren würden, wenn es nur ein int ist. Danke!

%Vor%     
havij 29.08.2017, 03:38
quelle

2 Antworten

7

Wie Sie in der Implementierung sehen können, haben Sie in Ihrem Link angegeben ), wenn ein geteilter Zeiger Kopie oder Kopie kopiert ist, ist der Zeiger auf den Referenzzähler ( ref_count ) geteilt zwischen allen Instanzen, die denselben Zeiger verwalten:

%Vor%

Auf diese Weise verweisen alle Instanzen dieses gemeinsamen Zeigers auf den gleichen Speicherort , um den Referenzzähler zu verfolgen, und der letzte shared_ptr kann wissen, ob er dies tun muss die Reinigung ( delete den zugewiesenen Speicher):

%Vor%

Haftungsausschluss

Diese Antwort basiert auf dem vereinfachten Beispiel des OP. Eine shared_ptr Implementierung ist weitaus komplizierter als die im Beispiel (denke an Atomizität, Rennbedingungen, etc ...).

    
whoan 29.08.2017, 03:47
quelle
3

Erstens, in anderen, um etwas zu teilen, müssen Sie es irgendwo hinstellen, wo andere Zugang haben können. Wie von @Igor Tandetnik bemerkt. Ein Objekt mit dynamischer Speicherdauer würde die Aufgabe also gut erfüllen. Ein Objekt einer statischen Speicherdauer mit dynamischer Initialisierung könnte es ebenfalls tun, aber das Objekt existiert für den Rest des Programms, was wir nicht wollen.

Zweitens ist shared_ptr ein bisschen komplizierter als das. Ein typisches shared_ptr würde sich auf einen Kontrollblock beziehen. Dieser Kontrollblock enthält normalerweise:

  • die Anzahl der gemeinsamen Referenzen auf das Objekt,
  • das fragliche Objekt oder ein Zeiger auf das Objekt,
  • und die Anzahl der schwachen Referenzen auf den Kontrollblock.

Für die Thread-Sicherheit wird die Anzahl der gemeinsamen Referenzen und die Anzahl der schwachen Referenzen typischerweise von einem atomaren Typ gehalten.

BEARBEITEN: Siehe @Passer By's Kommentar.

    
WhiZTiM 29.08.2017 03:54
quelle

Tags und Links