SPI_execute o una función similar
PostgreSQL asigna memoria dentro de
contextos de memoria, los cuales proporcionan un método conveniente para
gestionar asignaciones realizadas en muchos lugares diferentes que necesitan
vivir durante distintos periodos de tiempo. Destruir un contexto libera
toda la memoria asignada en él. Por lo tanto, no es necesario
hacer un seguimiento de los objetos individuales para evitar fugas de memoria; en su lugar,
solo se deben gestionar un número relativamente pequeño de contextos.
palloc y las funciones relacionadas asignan memoria
del contexto “actual”.
SPI_connect crea un nuevo contexto de memoria y
lo convierte en el actual. SPI_finish restaura el
contexto de memoria actual anterior y destruye el contexto creado por
SPI_connect. Estas acciones aseguran que las
asignaciones de memoria transitorias realizadas dentro de su función C se
recuperen al salir de la función C, evitando fugas de memoria.
Sin embargo, si su función C necesita devolver un objeto en memoria asignada
(como el valor de un tipo de datos de paso por referencia), no puede
asignar esa memoria utilizando palloc, al menos
no mientras esté conectado a SPI. Si lo intenta, el objeto será
desasignado por SPI_finish, y su función C no
funcionará de manera confiable. Para resolver este problema, utilice
SPI_palloc para asignar memoria para su objeto de retorno.
SPI_palloc asigna memoria en el “contexto superior del ejecutor”,
es decir, el contexto de memoria que estaba actual cuando se llamó a SPI_connect,
el cual es precisamente el contexto adecuado para un valor devuelto por su
función C. Varias de las otras funciones de utilidad descritas en
esta sección también devuelven objetos creados en el contexto superior del ejecutor.
Cuando se llama a SPI_connect, el contexto privado de la
función C, creado por SPI_connect, se convierte en el contexto actual.
Todas las asignaciones realizadas por palloc,
repalloc o funciones de utilidad de SPI (excepto lo
descrito en esta sección) se realizan en este contexto. Cuando una
función C se desconecta del administrador de SPI (a través de
SPI_finish), el contexto actual se restaura al
contexto superior del ejecutor, y todas las asignaciones realizadas en el
contexto de memoria de la función C se liberan y no se pueden utilizar más.