Как вернуть список dicts из C ++ в python, используя boost.python без утечки памяти? - PullRequest
0 голосов
/ 04 июля 2019

У меня есть код на 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 продолжает расти, пока вся система не остановится).

Что я делаю не так? Как я могу избежать этого?

...