boost-python – 使用boost :: python :: list作为返回值需要增加ob_refcnt吗?

我正在尽力在项目中的一个非常重要的模块中找到内存泄漏,并得到如下代码片段:

PyObject* python_func( const char* str )
{
       ..........................

    boost::python::list obj;
    obj.append(str);
    obj.ptr()->ob_refcnt++;  //this is necessary??
    return obj.ptr();
}

我对这一行很困惑:obj.ptr() – > ob_refcnt;

我认为ob_refcnt是由python内部为gc维护的,我们无法操作它所以显然导致这会导致内存泄漏,另一方面,obj会离开它的范围,我不确定是否boost :: python: :list deconstructor将减少ob_refcnt,如果这是真的,删除该行,将释放资源obj hold,这将导致崩溃.

所以我的问题是obj.ptr() – > ob_refcnt;是必要的,为什么?

最佳答案 代码增加引用计数的原因是python_func旨在返回对该对象的新引用. (新引用是引用计数已经增加的引用 – 返回新引用允许函数创建新对象,例如在这种情况下的新列表.)另一方面,ptr()成员函数返回借用了对象的引用.

正如您所推测的那样,如果代码未能增加借用引用的引用计数,则boost :: python :: list的析构函数将减少引用计数,并且返回的对象将无效.

请注意,您永远不应该直接访问PyObject的ob_refcnt成员.增加引用计数的正确方法是使用Py_INCREF宏或其boost :: python等效的boost :: python :: incref:

return boost::python::incref(obj.ptr());
点赞