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

2024-09-29 01:33:58 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我为C函数的Python包装器编写的代码,它使用旋转矩阵和向量进行一些简单的计算。我的函数是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;
}

我有一个内存泄漏的问题,我想。它将走向无穷远

enter image description here

我试着逐行评论,发现问题出在这一行:

  PyObject* the_object = PyFloat_FromDouble(vector[i]);

如果我用例如or1来回答vector[i],这是同样的问题。 但我不知道为什么,从数组或其他东西制作PyObjects有任何限制吗


Tags: 函数objecttransformpyobjectdoublevectorcd1cd2
1条回答
网友
1楼 · 发布于 2024-09-29 01:33:58

问题是您正在创建一个新对象(将其设置为refcount为1),将其附加到列表并返回列表,将其设置为refcount为2

当该列表超出范围时,它由GC收集,并将refcount浮动到1,但现在无法访问它,但refcount仍然不是0,因此它们永远存在于堆中,因此存在内存泄漏

正如我所说的,在添加到列表之后,只需删除浮动的refcount

相关问题 更多 >