Освобождение объекта PyTuple - PullRequest
0 голосов
/ 04 февраля 2011

Как правильно освободить объект PyTuple с помощью Python C-API?

Я знаю, что кортежи являются чем-то особенным, когда дело доходит до семантики подсчета ссылок, поскольку PyTuple_SetItem " украдет"ссылку на вставленный элемент.Я также знаю, что уменьшение ссылки на объект кортежа уменьшает счетчик ссылок всех элементов в кортеже.

Имея это в виду, я думаю, что можно с уверенностью сказать:

#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, так в чем же проблема?

1 Ответ

2 голосов
/ 12 февраля 2011

Добавьте вызов к Py_Initialize(); в начале main и повторите попытку.

...