python - 在处理 C 代码时是否存在任何 Python 引用计数/垃圾收集问题?

标签 python garbage-collection scheme reference-counting python-c-api

只是为了纯粹的麻烦,我决定创建一个 Scheme binding to libpython这样你就可以在 Scheme 程序中嵌入 Python。我已经能够调用 Python 的 C API,但我还没有真正考虑过内存管理。

mzscheme 的 FFI 的工作方式是我可以调用一个函数,如果该函数返回一个指向 PyObject 的指针,那么我可以让它自动增加引用计数。然后,我可以注册一个终结器,它将在 Scheme 对象被垃圾回收时减少引用计数。我看过 documentation for reference counting ,并且乍一看没有发现任何问题(尽管在某些情况下它可能不是最佳选择)。有没有我遗漏的问题?

此外,我在制作 cyclic garbage collector documentation 的正反面时遇到了麻烦.在这里我需要注意什么?特别是,我如何让 Python 知道我有对某物的引用,以便在我仍在使用它时它不会收集它?

最佳答案

您指向 http://docs.python.org/extending/extending.html#reference-counts 的链接是正确的地方。文档的扩展和嵌入以及 Python/C API 部分将解释如何使用 C API。

引用计数是使用 C API 的恼人部分之一。主要问题是保持一切正常:根据您调用的 API 函数,您可能拥有也可能不拥有对您获得的对象的引用。请仔细了解您是否拥有它(因此不能忘记将其 DECREF 或将其交给会窃取它的东西)或正在借用它(并且必须 INCREF 它以保留它并可能在您的功能期间使用它)。与此相关的最常见错误是 1) 错误地记住您是否拥有由特定函数返回的引用,以及 2) 认为您可以安全地借用引用,时间比现在长。

您不必为循环垃圾收集器做任何特殊的事情。它只是用来修补引用计数中的一个缺陷,不需要直接访问。

关于python - 在处理 C 代码时是否存在任何 Python 引用计数/垃圾收集问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2935186/

相关文章:

python - IPython notebook 命令返回错误

ios - 假设静态变量永远不会被清除是否安全?

algorithm - Miller-Rabin Scheme 实现不可预测的输出

python - 在Python中存储项目范围的全局对象

python - 创建一天中的时间直方图

python - NAO机器人对未知单词进行语音识别

java - Java 垃圾收集会释放它吗?

java - 我的应用程序内存泄漏?代码中的垃圾收集是一种好的做法吗?

scheme - 代码在 stk-simply 中有效,但在 mit-scheme 中无效

lisp - 为什么这个 script-fu 不起作用?