2016-09-20 2 views
0

Ich wollte einen Smart-Zeiger wie shared_ptr der Std-Bibliothek verwenden, aber wo wäre es möglich, das Objekt für jede shared_ptr zu löschen, die es teilen, ohne diese Zeiger zu löschen.shared_ptr Objekt globale Löschung

Zum Beispiel, wenn ich std :: shared_ptr

shared_ptr<A> p1 = make_share<A>(); 
shared_ptr<A> p2 = shared_ptr<A>(p1); 
p1.reset(); 
// now p2 still contain the object of type A 
// instead of nullptr 

Gibt es eine Möglichkeit, das zu tun oder nicht gibt einige Alternativen? Tue ich es falsch?

+0

Sie machen es irgendwie falsch. Der Zweck von shared_ptr ist, dass das Objekt nur dann zerstört wird, wenn niemand es mehr benutzt. Sie verwenden also die Art von Zeiger, der versucht, das zu verhindern, was Sie tun möchten. – Hayt

+1

Ist es meine oder scheint Ihre Beschreibung Ihrem Codebeispiel zu widersprechen? Gemeinsame Zeiger funktionieren bereits gemäß Ihrem Codierungsbeispiel. – Galik

+0

Sry, meine Erklärung kann schlecht sein. Ich meinte, existiert etwas anderes als shared_ptr, das p2 zu einem Nullptr nach p1.reset() haben könnte? – pepece

Antwort

3

Absolut. std::shared_ptr kommt mit std::weak_ptr, einem Zeiger, der auf ein Objekt zeigen kann, das von einer Menge von std::shared_ptrs verwaltet wird, und überprüft, ob es noch lebt, aber die Lebensdauer des Objekts nicht verlängert.

Sie müssen nur das Original std::shared_ptr zu Ihrem Objekt und verleihen std::weak_ptr s anderen Benutzern dieses Objekts. Wenn das Objekt zerstört werden muss, setze die std::shared_ptr zurück, und alle verbleibenden std::weak_ptr können dies sagen (sie geben null std::shared_ptr zurück, wenn die Benutzer versuchen, sie zu sperren).

+0

Gute Idee. Es ist etwas, wonach ich gesucht habe. Das einzige Problem ist, dass ich nicht der einzige bin, der diesen Code benutzt. Gibt es eine Möglichkeit, Übertreibungen dazu zu bringen, ein erstelltes 'shared_ptr' nicht kopieren zu können, außer wenn es sich um ein' weak_ptr' handelt? – pepece

+0

@pepece meinst du verhindern, dass andere Benutzer 'std :: shared_ptr's erstellen? Nicht sofort einsatzbereit, aber eine API, die nur 'std :: weak_ptr 'freigibt, zeigt deutlich an, dass die Benutzer die gesperrten Zeiger nicht länger als nötig festhalten sollten. Sie könnten einen Wrapper um 'std :: weak_ptr' schreiben, um nicht bewegliche Sperrobjekte zu erzeugen. – Quentin

+0

Genau. Sprechen Sie über std :: reference_wrapper, weil ich nicht sehe, was Sie bedeuten? – pepece