我刚刚开始使用python-c-api,并且可以肯定会在某个时候搞砸PyObject引用计数。因此,我试图找出什么是识别内存泄漏然后对其进行跟踪的良好工作流程。
遍历头文件,我看到了对Py_DEBUG,Py_REF_DEBUG甚至Py_TRACE_REFS的引用。但是我不确定如何使用它们,还没有找到关于它们使用的很好的教程。
人们在使用python-c-api时如何调试pyobject泄漏?
例如,我可以使用这些调试定义进行设置,以便如果我在调用Py_Finalize()之前尝试释放所有内容,那么我可以看到哪些python对象仍然存在,它们是什么,甚至可能在哪里分配了它们?
最佳答案
我的信誉不足,无法发表评论,因此添加为答案。
人们在使用python-c-api时如何调试pyobject泄漏?
一旦Python出现,使用Valgrind这样的常规工具很难做到这一点。
也建议不要调用Py_Finalize(),因为它已知会发生内存泄漏。仅在绝对需要时,即在析构函数中销毁对象或退出过程时,才在进程开始时调用Py_Initialize()并调用Py_Finalize()更为简单。
参考:https://bugs.python.org/issue1445210
关于内存泄漏,您必须了解新的,被盗的和借用的引用,并仔细阅读要调用的每个函数的文档,以了解将返回哪种类型的引用。
如果您使用的是C ++,而不是C,那么最好使用PyCXX或boost :: python或其他使用RAII来处理refcounting的C ++包装器。
希望这可以帮助。