我正在尽力在项目的一个非常重要的模块中找到内存泄漏,并获得了这样的代码片段:
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++;
是否必要,为什么?
答案 0 :(得分:2)
代码增加引用计数的原因是python_func
旨在将新引用返回给对象。 (新引用是引用计数已经增加的引用 - 返回新引用允许函数创建新对象,例如在这种情况下的新列表。)另一方面,ptr()
成员函数将借用的引用返回给对象。
正如您所推测的那样,如果代码未能增加借用引用的引用计数,则boost::python::list
的析构函数将减少引用计数,并且返回的对象将无效。
请注意,您永远不应该直接访问ob_refcnt
的{{1}}成员。增加引用计数的正确方法是使用PyObject
宏或其Py_INCREF
等效boost::python
:
boost::python::incref