我刚刚开始使用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 ++包装器。

希望这可以帮助。

10-07 18:51
查看更多