Что представляет собой потокобезопасный способ без утечки памяти для возврата строки из C ++ в интерфейс python SWIG?
SWIG автоматически скопирует содержимое возвращаемого значения char *
в строку Python. В этом руководстве по SWIG приведен пример:
char *__str__() {
static char temp[256];
/* WRITE STUFF TO STRING */
return &temp[0];
}
В их примере в качестве возвращаемого значения используется статическая строка, но если моя программа на C ++ имеет несколько потоков, они могут легко перезаписать строки друг друга.
Возврат вновь выделенной строки приведет к утечке памяти, поскольку SWIG не узнает, как ее освободить.
Единственное, о чем я могу думать, - это зарегистрировать и вернуть указатель на фактический строковый объект python (таким образом, сборщик мусора python позаботится об этом), но я не уверен, как это сделать, и мне интересно, есть ли более простой способ.
__str__
, которым не должны передаваться аргументы. - person Matt   schedule 07.07.2014std::string
s в строки Python. - person Matt   schedule 07.07.2014I don't think that would work with SWIG. First of all, SWIG would only be able to supply a pointer to the raw data of an immutable python string
Тогда в SWIG сильно не хватает функциональности, если нет возможности передать модифицируемый буфер функции.Second of all, that would violate the interface of methods such as __str__, which are not supposed to have any arguments passed to them
Тогда, возможно, вам следует написать фабричный класс C ++, который выделяет и возвращает строки. - person PaulMcKenzie   schedule 07.07.2014std::string
карты типов. - person Oliver   schedule 07.07.2014