SPI_execute или аналогичной
функцией
Digital Q.DataBase выделяет память внутри
контексты памяти, которые обеспечивают удобный способ управления выделением памяти в различных местах программы для объектов с разным временем жизни. Уничтожение контекста освобождает всю выделенную в нем память. Таким образом, во избежание утечек памяти нет необходимости отслеживать отдельные объекты; вместо этого достаточно управлять лишь относительно небольшим количеством контекстов.
palloc и связанные с ней функции выделяют память
из «текущего» контекста.
SPI_connect создает новый контекст памяти и
делает его текущим. SPI_finish восстанавливает предыдущий текущий контекст памяти и уничтожает контекст, созданный функцией
SPI_connect. Эти действия гарантируют, что временная память, выделенная внутри функции на языке C, будет освобождена при выходе из нее, что предотвращает утечку памяти.
Однако, если функция на языке C должна возвращать объект в выделенной памяти (например, значение типа данных, передаваемого по ссылке), вы не можете выделять эту память с помощью palloc, по крайней мере, пока вы подключены к SPI. Если вы попытаетесь это сделать, объект будет удален из памяти SPI_finish, и ваша
функция на языке C не будет работать стабильно. Чтобы решить эту проблему, используйте
SPI_palloc для выделения памяти под возвращаемый объект. SPI_palloc выделяет память в
«верхнем контексте исполнителя», то есть в контексте памяти, который был текущим в момент вызова SPI_connect ,
а это именно тот контекст, который необходим для значения, возвращаемого вашей
функцией на языке C. Некоторые другие вспомогательные функции, описанные в данном разделе, также возвращают объекты, созданные в верхнем контексте исполнителя.
Когда SPI_connect вызывается, текущим становится
закрытый контекст функции на языке C, созданный
SPI_connect, is made the current context. Все
операции выделения памяти, выполняемые palloc,
repalloc, или вспомогательными функциями SPI (за исключением случаев, описанных в данном разделе), производятся в этом контексте. Когда функция на языке C отключается от менеджера SPI (посредством
SPI_finish) текущий контекст восстанавливается до вышестоящего контекста исполнителя, а вся память, выделенная в контексте памяти функции на языке C, освобождается и более не может быть использована.