【问题标题】:Memory leaks in python wrapper for C++ algorithmC++ 算法的 python 包装器中的内存泄漏
【发布时间】:2015-12-12 03:24:26
【问题描述】:

我正在为 C++ 算法编写一个 python 包装器。

  • wrapper 的输入是单个字符串或字符串列表,
  • 输出是单个数字或列表。

这个包装器的主要功能如下:

PyObject* count_rep_list(PyObject *mod, PyObject *args){
    PyObject *inputList = PyTuple_GetItem(args, 0);
    PyObject *outputList = PyList_New(0);
    char* str;
    if(PyList_Check(inputList)) {
        for (size_t i = 0; i < PyList_Size(inputList); ++i) {
            PyObject *list_item = PyList_GetItem(inputList, i);
            if (!PyArg_Parse(list_item, "s", &str)) {
                Py_XDECREF(list_item);
                Py_XDECREF(inputList);
                Py_XDECREF(outputList);
                return NULL;
            }
            Py_DECREF(list_item);
            PyList_Append(outputList, PyLong_FromSize_t(repeating_count::count(string(str))));
        }
    }
    else if(!PyArg_ParseTuple(args, "s", &str)){
        Py_XDECREF(inputList);
        Py_XDECREF(outputList);
        return NULL;
    }
    else {
        PyList_Append(outputList, PyLong_FromSize_t(repeating_count::count(string(str))));
    }
    return outputList;
}

repeating_count::count() 的实现无关紧要。

此代码中是否存在内存泄漏?我该如何解决?

我知道,PyArg_Parse()PyArg_ParseTuple()str 动态分配内存。但是如果解析失败,我该如何释放这个内存呢?我不知道如何分配此内存,因此无法释放它。所以,

  • free(str),
  • delete(str),
  • delete str,
  • delete[] str

不工作。

你能帮帮我吗?

【问题讨论】:

  • 你看到那些Py_XDECREFs 了吗?对象有引用计数。
  • @KarolyHorvath,是的,但 Py_XDECREFPy_DECREF 仅适用于 PyObjects。 char*之后想释放内存怎么办?

标签: python c++ memory-leaks


【解决方案1】:

来自文档:

您不得为字符串本身提供存储空间;一个指针 现有字符串存储在字符指针变量中 你传递的地址。

https://docs.python.org/2.0/ext/parseTuple.html

你得到一个指向 python 托管字符串的指针,你不负责释放内存。

【讨论】:

    猜你喜欢
    • 2021-03-30
    • 2017-07-25
    • 2015-02-17
    • 2021-07-10
    • 2012-01-18
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    相关资源
    最近更新 更多