【问题标题】:Freeing a PyTuple object释放 PyTuple 对象
【发布时间】:2011-02-04 12:52:10
【问题描述】:

使用 Python C-API 释放 PyTuple 对象的正确方法是什么?

我知道元组在引用计数语义方面有些特殊,因为 PyTuple_SetItem "steals" 是对插入元素的引用。我也知道减少元组对象的引用会减少元组中所有元素的引用计数。

考虑到这一点,我认为应该可以安全地说:

#include <Python.h>
#include <stdio.h>

int main()
{
    PyObject* tup = PyTuple_New(1);
    PyTuple_SetItem(tup, 0, PyLong_FromLong(100L));

    printf("Ref Count: %d\n", tup->ob_refcnt);
    Py_DECREF(tup);
}

但是当我减少元组引用计数时,最后一行会导致分段错误。我不明白为什么会这样。在调用Py_DECREF 之前,引用计数是1,那么这里有什么问题?

【问题讨论】:

  • Py_DECREF 将释放元组,但此时的分段错误可能表明您已经在某些早期代码中损坏了内存。在您的代码中查看其他地方。如果您可以发布一个完整的可运行示例来演示该问题(我知道可能不容易)。
  • 不,这实际上是整个程序。但是,如果有帮助,我在周围添加了 #include 语句和 main 函数。
  • 第一:尝试在开头添加Py_Initialize();。
  • @Tomek,如果您要将解释器嵌入到您的 C 程序中,这难道不是必需的吗?
  • 你试过加Py_Initialize();吗?有帮助吗?在使用任何 Python API 调用之前,您需要调用 Py_Initialize。否则 Python 的内部变量将无法正确初始化;包括那些用于内存管理的。

标签: python c python-c-api python-c-extension


【解决方案1】:

在main开头添加对Py_Initialize();的调用,然后重试。

【讨论】:

  • 你是对的,几乎可以肯定,元组或长类型的一些初始化被遗漏,因此破坏失败。
猜你喜欢
  • 1970-01-01
  • 2011-11-18
  • 2011-07-15
  • 2015-09-25
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多