如何在不泄漏内存的情况下使用boost.python从C ++向python返回字典列表?

时间:2019-07-04 18:20:18

标签: python c++ boost memory-leaks boost-python

我有一些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

它会泄漏内存(即python进程的VSZ一直在增长,直到整个系统停止运行)。

我在做什么错?如何避免这种情况?

0 个答案:

没有答案