【发布时间】:2021-01-04 05:27:03
【问题描述】:
这是我用于 C 函数的 Python Wrapper 的代码,它使用旋转矩阵和向量进行一些简单的计算。我的函数是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有什么限制?
【问题讨论】:
-
我的猜测:您在返回之前没有删除引用计数,因此对象永远位于 tge 堆中,但大问题在哪里
-
推入数组后尝试减少the_object的引用计数
-
你是对的。
Py_DECREF(the_object);添加 obj 到列表后解决问题。谢谢! -
看起来你也没有释放
vector(如果它是由transform_object()分配的)。
标签: python c python-3.x python-c-api