У меня есть код на C ++, и я хочу вызвать его из Python. Код C ++ возвращает списки диктов к коду Python. Для этого я использую boost.python следующим образом:
struct MyStruct {
int foo;
};
class MyClass
{
public:
std::vector<MyStruct> get_stuff();
};
struct MyStructConverter
{
static PyObject* convert(const std::vector<MyStruct>& v)
{
boost::python::list ret;
for (auto c : v) {
boost::python::dict *r = new boost::python::dict();
(*r)["foo"] = c.foo;
ret.append(boost::python::object(*r));
}
return boost::python::incref(ret.ptr());
}
};
/** Interface between C++ and Python
*/
BOOST_PYTHON_MODULE(glue)
{
boost::python::to_python_converter<std::vector<MyStruct>, MyStructConverter>();
class_<MyClass, boost::noncopyable>("MyClass")
.def("get_stuff", &MyClass::get_stuff);
}
Это работает до такой степени, что я могу передавать данные из C ++ в python. Однако при использовании следующим образом:
# test.py
x = MyClass()
while True:
u = x.get_stuff()
# do something with u
это приводит к утечке памяти (то есть VSZ процесса python продолжает расти, пока вся система не остановится).
Что я делаю не так? Как я могу избежать этого?