【问题标题】:Querying Python runtime for all objects in existence查询所有存在的对象的 Python 运行时
【发布时间】:2014-12-01 06:53:48
【问题描述】:

我正在开发一个 C++ Python 包装器,试图封装引用计数、保留、释放的尴尬。

它有一组单元测试。

但是,我想确保在每次测试之后,所有东西都已被正确清除。即,在该测试期间创建的每个对象的引用计数都已降至 0,因此已被删除。

有没有办法在 Python 运行时查询这些信息?

如果我能得到存储的对象的数量,那就行了。然后我可以确定它在测试之间不会改变。

编辑:我相信可以使用特殊标志编译 Python,生成具有监视引用计数功能的二进制文件。但这就是我所知道的。也许更多...

【问题讨论】:

    标签: python-c-api reference-counting


    【解决方案1】:

    这取决于您使用的实现。我假设您使用的是 cpython。由于您正在摆弄引用计数机制,我将进一步假设使用垃圾收集器查找剩余对象对于您的目的而言不够可靠。 (否则,请参阅here。)

    您正在考虑的构建标志是这个:

    最好在 EXTRA_CFLAGS make 变量中定义这些选项:

    make EXTRA_CFLAGS="-DPy_REF_DEBUG".

    Py_REF_DEBUG 1.4 引入 在 1.4 之前命名为 REF_DEBUG

    开启聚合引用计数。这安排了外部 _Py_RefTotal 保存所有引用的计数,ob_refcnt 的总和 所有对象。 [..] 特殊噱头: sys.gettotalrefcount() 返回所有引用计数的当前总数。

    (来源:Python git, SpecialBuilds.txtDebugging builds from the C API reference。)

    如果您需要所有指向活动对象的指针的列表,请使用 Py_TRACE_REFS,直接在 SpecialBuilds 文件中的指针下方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-31
      • 2022-01-10
      • 2021-04-30
      • 1970-01-01
      • 2022-01-26
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多