Solo por pura casualidad, he decidido crear un Scheme binding to libpython para que pueda incrustar Python en programas Scheme. Ya puedo llamar a la API C de Python, pero realmente no he pensado en la gestión de memoria.¿Hay problemas de conteo de Python/recolección de basura al tratar con el código C?
La manera en que funciona el FFI de mzscheme es que puedo llamar a una función, y si esa función devuelve un puntero a PyObject
, entonces puedo hacer que aumente automáticamente el recuento de referencias. Luego, puedo registrar un finalizador que disminuirá el recuento de referencias cuando el objeto Scheme obtiene basura recolectada. Miré documentation for reference counting, y no veo ningún problema con esto a primera vista (aunque en algunos casos puede ser subóptimo). ¿Hay algún truco que me falta?
Además, estoy teniendo problemas para hacer cara o cruz del cyclic garbage collector documentation. ¿Qué cosas tendré que tener en cuenta aquí? En particular, ¿cómo hago que Python sepa que tengo una referencia a algo para que no lo recopile mientras lo sigo usando?
Entonces ... Python utiliza el recuento de referencias * y * un recolector de basura para la estructura cíclica? Esa es una falla bastante importante. El tipo de diseño. En cualquier caso, esto parece que hará las cosas mucho más "divertidas" para Jason, si los valores que participan en un ciclo de python están expuestos a un esquema. –
Buena información. Mientras INCREFIÉ todo cuando lo obtenga y DECREF todo cuando termine con él, ¿debería estar bien? ¿O hay algún problema con el que me encuentre? –
@Jason, solo INCREF * borrowed * references. Algunas funciones devuelven * nuevas * referencias que ya están INCREF'ed. INCREFARlos resultaría en una pérdida de memoria. –