4

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

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 持有将被释放,这将导致崩溃。

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

4

1 回答 1

2

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

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

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

return boost::python::incref(obj.ptr());
于 2013-08-11T09:21:11.037 回答