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

时间:2013-08-11 03:52:17

标签: boost-python

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

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会离开其范围,我不确定是否提升: :python :: list deconstructor将减少ob_refcnt,如果这是真的,删除该行,将释放资源obj hold,这将导致崩溃。

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

1 个答案:

答案 0 :(得分:2)

代码增加引用计数的原因是python_func旨在将新引用返回给对象。 (新引用是引用计数已经增加的引用 - 返回新引用允许函数创建新对象,例如在这种情况下的新列表。)另一方面,ptr()成员函数将借用的引用返回给对象。

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

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

boost::python::incref