Hay dos macros, Py_INCREF(x)
y Py_DECREF(x)
,
que gestionan el incremento y decremento del saldo de referencias.
Py_DECREF() también libera el objeto cuando el saldo
llega a cero. Para ser más flexible, no llama a free() directamente,
sino que realiza una llamada mediante un puntero a función del
tipo de objeto del objeto. Por esto y otros motivos, cada objeto
también contiene un puntero a su tipo de objeto.
Queda la gran cuestión: cuándo usar Py_INCREF(x)
y
Py_DECREF(x)
. Vamos a presentar algunos términos. Nadie
``posee'' un objeto, pero puede poseer una referencia al objeto.
El saldo de referencias del objeto se define ahora como el número de
referencias a él que tengan dueño. El dueño de una referencia tiene la
responsabilidad de llamara a Py_DECREF() cuando no se necesite
más la referencia. La propiedad de una referencia es transferible. Hay tres modos
de deshacerse de una referencia propia: Transferirla, almacenarla o llamar a
Py_DECREF(). Si se olvida deshacerse de una referencia propia
se causará una pérdida de memoria.
También es posible tomar prestada1.3 una referencia al objeto. El que toma prestada la referencia no debe utilizar el objeto más tiempo que su dueño. Si se usa una referencia prestada después de que el dueño se haya deshecho de ella, hay un riesgo de que se utilice memoria liberada que se debe evitar por completo1.4.
La ventaja de tomar prestada una referencia en lugar de poseerla estriba en que no hay que ocuparse de deshacerse de la referencia en todo recorrido posible del código. Dicho con otras palabras, con una referencia prestada no hay peligro de pérdidas en el caso de salidas prematuras. La desventaja es que hay situaciones muy sutiles en que código aparentemente correcto utiliza una referencia prestada cuando su dueño ya se había deshecho de ella.
Se puede tomar posesión de una referencia prestada llamando a Py_INCREF(). Esto no afecta al estado del dueño original de la referencia, sólo crea una nueva propiedad de la referencia y carga al nuevo propietario con las mismas responsabilidades de dueño (es decir, el nuevo propietario debe deshacerse de la referencia correctamente, como también debe el antiguo propietario).