Was ist eine Thread-sichere und Speicher-leckfreie Möglichkeit, eine Zeichenfolge von C++ an die SWIG Python-Schnittstelle zurückzugeben?Was ist der beste Weg, um eine Zeichenfolge an die SWIG Python-Schnittstelle zurückzugeben?
SWIG wird automatisch den Inhalt eines char *
Rückgabewerts in eine Python-Zeichenfolge kopieren. This SWIG guide gibt das Beispiel:
char *__str__() {
static char temp[256];
/* WRITE STUFF TO STRING */
return &temp[0];
}
Ihr Beispiel eine statische Zeichenfolge als Rückgabewert verwendet, aber wenn meine C++ Programm mehrere Threads hat, könnten sie leicht jeweils anderen Saiten überschreiben.
Die Rückgabe einer neu zugewiesenen Zeichenfolge würde zu einem Speicherverlust führen, da SWIG nicht wissen würde, dass es freigegeben werden soll.
Das einzige, was ich mir vorstellen kann, ist zu registrieren und einen Zeiger auf eine tatsächliche Python-String-Objekt zurückgeben (so würde der Python-Garbage Collector kümmern), aber ich bin mir nicht sicher, wie das geht und bin frage mich, ob es einen leichteren Weg gibt.
Was ist mit der bewährten Methode, dass der Aufrufer den Puffer bereitstellt und der C++ - Code nur in diesen Puffer kopiert wird? So behandelt beispielsweise die Windows-API Zeichenfolgen. – PaulMcKenzie
@PaulMcKenzie Ich glaube nicht, dass das mit SWIG funktionieren würde. Erstens könnte SWIG nur einen Zeiger auf die Rohdaten einer unveränderlichen Python-Zeichenkette liefern, die Python zum Absturz bringen würde, wenn sie modifiziert würde. Zweitens würde dies die Schnittstelle von Methoden wie "__str__" verletzen, denen keine Argumente übergeben werden sollen. – Matt
Haben Sie versucht, einen Wrapper zu erstellen, der eine std :: string zurückgibt? – Schollii