【发布时间】: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_XDECREF和Py_DECREF仅适用于PyObjects。char*之后想释放内存怎么办?
标签: python c++ memory-leaks