PyObject或PyFloat转换的内存泄漏问题

问题描述

这是我的Python包装函数C代码代码,使用“旋转矩阵”和“向量”进行了一些简单的计算。我的功能window.context,但它没有引起问题(我也在不执行此功能的情况下对其进行了调试)。

transform_object

我想我的内存泄漏有问题。它将达到无穷大。

enter image description here

我试图逐行注释,发现问题出在这一行:

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,因此它们永远存在于堆中,因此内存泄漏

正如我所说,只需在添加到列表后删除浮点数的引用计数