Jav*_*ier 3 c python memory-management
似乎每次我调用一个返回PyObject*的函数时,我都要添加四行错误检查.例:
py_fullname = PyObject_CallMethod(os, "path.join", "ss", folder, filename);
if (!py_fullname) {
Py_DECREF(pygame);
Py_DECREF(os);
return NULL;
}
image = PyObject_CallMethodObjArgs(pygame, "image.load", py_fullname, NULL);
Py_DECREF(py_fullname);
if (!image) {
Py_DECREF(pygame);
Py_DECREF(os);
return NULL;
}
image = PyObject_CallMethodObjArgs(image, "convert", NULL);
if (!image) {
Py_DECREF(pygame);
Py_DECREF(os);
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?有一个更好的方法吗?这有一个额外的问题,我可能会忘记我应该的所有东西Py_DECREF().
Ale*_*lli 10
这就是gotoC编码中存在的原因(尽管不完全;-)(与C++和支持异常的其他语言相反):它是唯一在代码主线上没有重复终止块的好方法 - errorexit每次返回值检查的条件向前跳转,带有errorexit:执行递减的标签(文件关闭,以及终止时需要做的其他事情)和return NULL.