只是为了纯粹的麻烦,我决定创建一个 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/