Есть ли какие-либо счетные ссылки на Python / Collection GoTCHAS при работе с C-кодом C?

StackOverflow https://stackoverflow.com/questions/2935186

Вопрос

Только для того, чтобы черт возьми, я решил создать Схема привязки к libpython Таким образом, вы можете встроить Python в схемах программ. Я уже могу позвонить в API Python C C, но я действительно не думал о управлении памятью.

То, как работает FFI Mzcheme, что я могу вызвать функцию, и если эта функция возвращает указатель на PyObject, Тогда я могу получить его автоматически увеличивать ссылку. Затем я могу зарегистрировать финализатор, который будет уменьшить ссылочный счет, когда объект схемы получает сборщик мусора. Я посмотрел на Документация для ссылки, И не видите никаких проблем с этим на первый взгляд (хотя в некоторых случаях оно может быть подаптимальным в некоторых случаях). Есть ли есть чтены, я скучаю?

Кроме того, у меня проблемы с головами или хвостами Документация циклической сборщики мусора. Отказ Что мне нужно учитывать здесь? В частности, как я могу знать Python, что у меня есть ссылка на что-то, так что не собирать его, пока я все еще использую это?

Это было полезно?

Решение

Ваша ссылка на http://docs.cython.org/extending/extending.html#Reference-counts. это правильное место. Расширение и встраиваемые и Python / C Разделы документации являются те, которые объяснят, как использовать C API.

Подсчет ссылок - одна из раздражающих частей использования C API. Главная Gotcha сохраняет все прямое: в зависимости от функции API, которую вы звоните, вы можете или не можете владеть ссылкой на объект, который вы получаете. Будьте осторожны, чтобы понять, владеете ли у вас (и, следовательно, не можете забыть его или дать ему что-то, что он его украдет) или займет его (и должен incref его сохранить и, возможно, использовать его во время вашей функции). Наиболее распространенные ошибки, связанные с этим, являются 1).

Вам не нужно делать ничего особенного для циклического сборщика мусора. Это просто там, чтобы исправить недостаток в отсчете обращения и не требует прямого доступа.

Другие советы

Самая большая банка, я знаю с Ref Counting, и C API является __del__ предмет. Когда у вас есть заимствованная ссылка на что-то, вы думаете, что вы можете уйти без incref'ing, потому что вы не отказываетесь от Gil, пока вы используете эту ссылку. Но, если вы в конечном итоге удаляете объект (например, удалив его из списка), возможно, вы вызываете __del__ Звоните, что может удалить ссылку, которую вы заимствоваете от ног. Очень хитрый.

Если вы incref (а потом decref, конечно) все заемные ссылки, как только вы их получите, не должно быть никаких проблем.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top