Ein Steuerblock eines shared_ptr
wird am Leben gehalten, während es mindestens einen weak_ptr
vorhanden ist. Wenn der gemeinsame Zeiger mit make_shared
erstellt wurde, bedeutet das, dass der gesamte Speicher des Objekts reserviert bleibt. (Das Objekt selbst ist ordnungsgemäß zerstört, aber da der Steuerblock und der Speicher für das Objekt in einem Chunk zugewiesen wurden, wie make_shared
, können sie nur gemeinsam freigegeben werden.)weak_ptr, make_shared und Speicherfreigabe
Ist mein Verständnis korrekt?
Es scheint, dass dieses Verhalten ein Problem darstellt, zum Beispiel in den berühmten "cache example". Der Speicher für die Objekte wird für immer reserviert bleiben.
Es es ein Problem in allen praktischen Situationen? Soll die shared_ptr
mit einem Konstruktor in einer solchen Situation erstellt werden (großes Objekt und Absicht, weak_ptr
s zu verwenden)?
, aber nicht vergessen viele „große“ Objekte werden ihre eigenen Speicher dynamisch, beispiels ein Objekt zuweisen, bestehend aus einem 'std :: VECTOR', so dass dynamisch zugewiesenen Speicher freigegeben werden _will_, wenn das Objekt zerstört wird. Sie müssen sich nur sorgen, wenn die Größe des Objekts selbst groß ist, z. B. ein großes 'std :: array'. –
Wenn Sie sich Sorgen um die Sicherheit Ausnahme sind, könnten Sie 'statt make_unique' verwenden und dann eine' shared_ptr' von Ihrem 'unique_ptr' konstruieren: z' std :: shared_ptr ptr = std :: make_unique (); ' –