Erstellen von weak_ptr aus dem rohen Zeiger

8

Ich möchte rohe Pointer-Member in einen Smart Pointer einfügen, um das Löschen in einer Entwicklungsklasse zu verhindern. Besitzer des Objekts unter Zeiger befindet sich außerhalb der Klasse. Sieht so aus, als ob boost::shared_ptr und std::auto_ptr nicht passen. Das Folgende ist ein reduziertes Beispiel:

%Vor%

Natürlich verursacht es einen Kompilierungsfehler. Was ist eine korrekte Methode, weak_ptr von einem rohen Zeiger zu initialisieren (falls vorhanden)?

    
Loom 02.10.2013, 15:02
quelle

5 Antworten

10

Sie können das nicht, Sie können nur ein weak_ptr aus einem shared_ptr oder einem anderen weak_ptr erzeugen. Die Idee wäre also, dass der Besitzer des Zeigers ein shared_ptr anstelle eines rohen Zeigers hält, und alles sollte in Ordnung sein.

    
Julien Lopez 02.10.2013, 15:06
quelle
5

Die einzige Möglichkeit besteht darin, einen shared_ptr oder weak_ptr zu erhalten, dem der Zeiger gehört, andernfalls kann weak_ptr den vorhandenen Besitzer nicht finden, um den Besitz mit ihm zu teilen.

Der einzige Weg, um shared_ptr von einem rohen Pointer zu erhalten, der bereits einem anderen shared_ptr gehört, ist, wenn Bar von enable_shared_from_this<Bar> abgeleitet ist, dann können Sie

machen %Vor%     
Jonathan Wakely 02.10.2013 15:25
quelle
4

Der Zweck eines schwachen Zeigers ist, den rohen Zeiger nicht verwenden zu können, wenn er gelöscht wurde. Wenn Sie jedoch einen rohen Zeiger haben, kann der schwache Zeiger nicht wissen, dass er gelöscht wurde. Stattdessen müssen Sie eine shared_ptr irgendwo haben, die den rohen Zeiger "besitzt". Dann können Sie ein weak_ptr erstellen, das auf shared_ptr verweist.

Wenn shared_ptr den Gültigkeitsbereich verlässt und der letzte "starke" intelligente Zeiger ist, wird der rohe Zeiger automatisch gelöscht. Wenn Sie dann versuchen, das weak_ptr zu sperren, wird es sehen, dass kein "starker" Zeiger übrig ist und daher das Objekt nicht existiert.

    
Keith4G 02.10.2013 15:09
quelle
2

Alles, was Sie gesagt haben, scheint vollkommen vernünftig zu sein, bis auf eine Sache:

%Vor%

Dies sollte keinen rohen Zeiger nehmen. Es sollte idealerweise ein weak_ptr oder möglicherweise ein shared_ptr sein, wenn Sie ein überzeugendes Argument haben.

Der tatsächliche Besitzer des fraglichen Objekts sollte das weak_ptr konstruieren und dann setBar damit aufrufen. Dies bewahrt die Besitz-Semantik. Es sieht so aus, als würden Sie das besitzende Objekt mit einem rohen Zeiger versehen und an setBar übergeben. Dies erzeugt eine semantische Lücke im Besitz des Objekts.

    
John Dibling 02.10.2013 15:11
quelle
1

Übergeben Sie den gemeinsamen Zeiger anstelle des rohen Zeigers und erstellen Sie Ihren schwachen Zeiger aus diesem gemeinsamen Zeiger. Dies ist wirklich die einzige Möglichkeit, wenn der Besitzer des Zeigers außerhalb einer Klasse ist.

    
Ilya Kobelevskiy 02.10.2013 15:06
quelle

Tags und Links