Ist es möglich, einen Boost shared_ptr von C ++ an Python und zurück an C ++ zu übergeben?

9

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%     
Philip Dunstan 31.08.2012, 01:11
quelle

2 Antworten

0

Sie benötigen class_<UseSharedPtr, shared_ptr<UseSharedPtr>, boost::noncopyable> , damit boost :: python weiß, dass es das Objekt mit shared_ptr verwalten soll. Mach dein Beispiel kompilierbar, wenn ich das überprüfen soll.

    
eudoxos 28.11.2012 12:43
quelle
0

Eine einfache, aber hässliche Problemumgehung wäre die Verwendung von enable_shared_from_this() für die Klasse Captured und das Erhalten eines neuen shared_ptr für jeden Parameter mit shared_from_this() .

%Vor%     
Tali 22.03.2017 14:03
quelle

Tags und Links