boostpython内存泄漏 < >我有一个代码,在C++中进行一些计算,然后使用BooSt.python(和Boosi.NoPy)将结果返回到Python。更准确地说,这里有一个简化的例子。首先,它是一个函数 namespace np = boost::python::numpy; std::pair<np::ndarray, np::ndarray> f() { const auto dt = np::dtype::get_builtin<double>(); np::ndarray a = np::empty(a_shape, dt); np::ndarray b = np::empty(b_shape, dt); // filling arrays return {std::move(a), std::move(b)}; }

boostpython内存泄漏 < >我有一个代码,在C++中进行一些计算,然后使用BooSt.python(和Boosi.NoPy)将结果返回到Python。更准确地说,这里有一个简化的例子。首先,它是一个函数 namespace np = boost::python::numpy; std::pair<np::ndarray, np::ndarray> f() { const auto dt = np::dtype::get_builtin<double>(); np::ndarray a = np::empty(a_shape, dt); np::ndarray b = np::empty(b_shape, dt); // filling arrays return {std::move(a), std::move(b)}; },python,c++,numpy,boost,Python,C++,Numpy,Boost,一切正常:我从python调用GetData()方法并获得正确的数据。问题是,我创建的所有这些numpy数组(可能还有dict)永远不会被删除,即使python代码中对它们的所有引用都被删除(并且调用gc.collect()根本没有帮助)。在python中执行此实例的del时,将调用WrappedClass实例的析构函数 从C++代码中返回Python对象的正确方法是什么,以避免内存泄漏? namespace p = boost::python; class WrappedClass { pu

一切正常:我从python调用
GetData()
方法并获得正确的数据。问题是,我创建的所有这些numpy数组(可能还有dict)永远不会被删除,即使python代码中对它们的所有引用都被删除(并且调用
gc.collect()
根本没有帮助)。在python中执行此实例的
del
时,将调用
WrappedClass
实例的析构函数

从C++代码中返回Python对象的正确方法是什么,以避免内存泄漏?

namespace p = boost::python;

class WrappedClass {
public:
    p::dict GetData() {
        p::dict result;
        for (const std::string& key : keys_) {
            auto arrays = f();
            result[key] = p::make_tuple(std::move(arrays.first), std::move(arrays.second));
        }
        return result;
    }
};