PyObject 或 PyFloat 转换的内存泄漏问题
Memory leak problem with PyObject or PyFloat conversion
这是我的 Python Wrapper for C 函数的代码,使用旋转矩阵和向量进行一些简单的计算。我的函数是 transform_object
,但它并没有引起问题(我也在调试它而没有执行这个函数)。
static PyObject* method_transform(PyObject* self, PyObject* args) {
double or1, or2, or3;
double cd1, cd2, cd3;
double ang1, ang2, ang3;
if (!PyArg_ParseTuple(args, "(ddd)(ddd)(ddd)", &or1, &or2, &or3, &cd1, &cd2, &cd3, &ang1, &ang2, &ang3)) {
return NULL;
}
double or[3] = { or1, or2, or3 };
double cd[3] = { cd1, cd2, cd3 };
double ang[3] = { ang1, ang2, ang3 };
double* vector = transform_object(or , cd, ang);
PyObject* list = PyList_New(0);
int len = 3;
for (int i = 0; i < len; i++) {
PyObject* the_object = PyFloat_FromDouble(vector[i]);
PyList_Append(list, the_object);
}
return list;
}
我想我有内存泄漏问题。它将走向无穷大。
我试图逐行评论,发现问题出在这一行:
PyObject* the_object = PyFloat_FromDouble(vector[i]);
如果我将 vector[i]
替换为例如。 or1
同样的问题。
但我不知道为什么,从数组或其他东西制作 PyObjects
有任何限制吗?
问题是您正在创建一个新对象(将其引用计数设置为 1),将其附加到列表并返回列表,将引用计数设置为 2
当该列表超出范围时,它会被 GC 收集,并将浮动引用计数降为 1,但现在无法访问它,但引用计数仍然不为 0,因此它们永远存在于堆中,所以你有你的内存泄漏。
正如我所说,在附加到列表后删除浮点数的引用计数
这是我的 Python Wrapper for C 函数的代码,使用旋转矩阵和向量进行一些简单的计算。我的函数是 transform_object
,但它并没有引起问题(我也在调试它而没有执行这个函数)。
static PyObject* method_transform(PyObject* self, PyObject* args) {
double or1, or2, or3;
double cd1, cd2, cd3;
double ang1, ang2, ang3;
if (!PyArg_ParseTuple(args, "(ddd)(ddd)(ddd)", &or1, &or2, &or3, &cd1, &cd2, &cd3, &ang1, &ang2, &ang3)) {
return NULL;
}
double or[3] = { or1, or2, or3 };
double cd[3] = { cd1, cd2, cd3 };
double ang[3] = { ang1, ang2, ang3 };
double* vector = transform_object(or , cd, ang);
PyObject* list = PyList_New(0);
int len = 3;
for (int i = 0; i < len; i++) {
PyObject* the_object = PyFloat_FromDouble(vector[i]);
PyList_Append(list, the_object);
}
return list;
}
我想我有内存泄漏问题。它将走向无穷大。
我试图逐行评论,发现问题出在这一行:
PyObject* the_object = PyFloat_FromDouble(vector[i]);
如果我将 vector[i]
替换为例如。 or1
同样的问题。
但我不知道为什么,从数组或其他东西制作 PyObjects
有任何限制吗?
问题是您正在创建一个新对象(将其引用计数设置为 1),将其附加到列表并返回列表,将引用计数设置为 2
当该列表超出范围时,它会被 GC 收集,并将浮动引用计数降为 1,但现在无法访问它,但引用计数仍然不为 0,因此它们永远存在于堆中,所以你有你的内存泄漏。
正如我所说,在附加到列表后删除浮点数的引用计数