【问题标题】:Possible memory leaks可能的内存泄漏
【发布时间】:2012-08-22 20:33:47
【问题描述】:

有人可以检查是否存在内存泄漏吗?我很困惑。

PyObject * somefunc(int function_id, int num_params, int * params){
    PyObject * params_list=PyList_New(0);
        for(int i=0; i < num_params; i++){
             PyObject * val = Py_BuildValue("i", params[i]);
             PyList_Append(params_list, val);
             Py_DecRef(val);
        }

        PyObject * arglist = Py_BuildValue("(i,O)",
            function_id, params_list);
         //Should I DecRef(params_list) ??

        return arglist;
}

【问题讨论】:

  • 尝试代码时会发生什么?
  • 我没用过cpython,但你应该按照你的建议,在函数结束时释放params_list内存。
  • 什么输出?内存泄漏不显示任何输出...

标签: c++ python cpython python-embedding python-extensions


【解决方案1】:

C API documentation 中所述,Py_BuildValueO 格式代码会增加其参数的引用计数,因此您正在泄漏对params_list 的引用。

您可以通过添加Py_DECREF 调用或改用N 格式代码来解决此问题,它的作用类似于O,但拥有其参数的所有权。

【讨论】:

    猜你喜欢
    • 2011-01-03
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多