Ich habe ein Objekt, das in C ++ in einem shared_ptr gespeichert ist. Auf das Objekt wird über die Python-Bindungen von innerhalb von Python zugegriffen und an eine andere gebundene C ++ - Funktion übergeben, die versucht, diese zu behalten. Es scheint, dass, wenn das Objekt von C ++ nach Python wechselt, es von einem shared_ptr in ein Python-Objekt umgewandelt wird. Wenn es dann in C ++ zurückkehrt, wird es vom Python-Objekt in ein neues shared_ptr konvertiert, jedoch steht dieses shared_ptr in keinem Zusammenhang mit dem ursprünglichen shared_ptr.
Ist es möglich, die Boost-Python-Bindings so einzurichten, dass die Konvertierung vom Python-Objekt in shared_ptr auf die ursprünglichen shared_ptr-Interna verweist?
Unten ist der gekürzte Code, mit dem ich das Problem gezeigt habe.
In diesem Beispiel wird ein Objekt zunächst in einem shared_ptr namens s_inital gehalten. Es wird von Python über die getSharedPtr-Funktion abgerufen und dann über die putSharedPtr-Funktion zurück nach C ++ geschoben. Innerhalb von putSharedPtr wird es in den weak_ptr s_copied kopiert. Die Überprüfung der Zeiger im Debugger zeigt, dass das shared_ptr, das in putSharedPtr verwendet wird, nicht die gleichen internen Referenzen wie s_initial hat. Die letzte Assertion wird ausgelöst, weil der schwache Zeiger s_copied nur auf einen einzelnen starken Zeiger (den in putSharedPtr verwendeten Zeiger) bezogen war und dieser Zeiger zerstört wurde, sobald putSharedPtr beendet wurde.
%Vor%Tags und Links boost boost-python shared-ptr