问题描述
这是我的Python包装函数C代码的代码,使用“旋转矩阵”和“向量”进行了一些简单的计算。我的功能是window.context
,但它没有引起问题(我也在不执行此功能的情况下对其进行了调试)。
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,or3 };
double cd[3] = { cd1,cd3 };
double ang[3] = { ang1,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
有什么限制?
解决方法
问题是您正在创建一个新对象(将此对象的refcount设置为1),将其附加到列表中并返回该列表,此对象的refcount设置为2
当该列表超出范围时,它由GC收集,并且将refcount下降到1,但现在无法访问它,但是refcount仍然不为0,因此它们永远存在于堆中,因此内存泄漏
正如我所说,只需在添加到列表后删除浮点数的引用计数