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:
Natürlich verursacht es einen Kompilierungsfehler. Was ist eine korrekte Methode, weak_ptr
von einem rohen Zeiger zu initialisieren (falls vorhanden)?
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.
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
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.
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.
Ü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.