Вам нужно, чтобы количество ссылок объекта было равно числу PyObject*
, которое ссылается на него.
Да - вы возвращаете PyObject*
в свой код Python, поэтому вам следует увеличить счетчик ссылок.
Нет - когда создается linecache[0]
, он имеет повторный счет 1, и это означает владение linecache
. Несколько мест могут «владеть» одним объектом Python.
Да, вы возвращаете один и тот же указатель несколько раз; Нет, это не приведет к множественным свободам. Указатель освобождается, когда счетчик ссылок достигает 0. Это произойдет, когда вы прервете все ссылки на значения, которые вы вернули из next
, и когда вы потеряете ссылку в linecache
(когда вызывается PyFastFile_dealloc
) .
Я не понимаю последний вопрос, но код здесь в основном правильный.
Единственная проблема, которую я вижу здесь, это «что такое linecache
/ кому она принадлежит». Если это глобальная переменная, то она может быть разделена между несколькими PyFastFile
объектами, что, вероятно, неправильно. Уничтожение одного PyFastFile
приведет к освобождению всего linecache
, но вы не pop_back
или NULL
указатели.