Che cos'è un modo thread-safe e privo di memoria per restituire una stringa da C++ all'interfaccia Python SWIG?Qual è il modo migliore per restituire una stringa all'interfaccia Python SWIG?
SWIG copia automaticamente il contenuto di un valore di ritorno char *
in una stringa python. This SWIG guide dà l'esempio:
char *__str__() {
static char temp[256];
/* WRITE STUFF TO STRING */
return &temp[0];
}
Il loro esempio utilizza una stringa statica come valore di ritorno, ma se il mio programma C++ ha più thread, si potrebbe facilmente sovrascrivere le rispettive corde.
Il ripristino di una stringa appena assegnata creerebbe una perdita di memoria, poiché SWIG non avrebbe saputo liberarlo.
L'unica cosa che posso pensare è di registrare e restituire un puntatore a un vero oggetto stringa python (in questo modo il garbage collector python si prenderà cura di esso), ma non sono sicuro di come farlo chiedendo se c'è un modo più semplice.
Che dire del metodo provato e vero per far sì che il chiamante fornisca il buffer e il codice C++ copi semplicemente in quel buffer? Ecco come, ad esempio, l'API di Windows gestisce le stringhe. – PaulMcKenzie
@PaulMcKenzie Non penso che funzionerebbe con SWIG. Prima di tutto, SWIG sarebbe in grado di fornire un puntatore ai dati grezzi di una stringa python immutabile, che potrebbe causare il crash di Python se modificato. In secondo luogo, ciò violerebbe l'interfaccia di metodi come '__str__', che non dovrebbero avere argomenti passati a loro. – Matt
Hai provato a creare un wrapper che restituisce una stringa std ::? – Schollii