44.3. Управление памятью#

44.3. Управление памятью

44.3. Управление памятью #

SPI_palloc — выделить память в контексте верхнего исполнителя
SPI_repalloc — перераспределить память в контексте верхнего исполнителя
SPI_pfree — освобождение памяти в верхнем контексте исполнителя
SPI_copytuple — создает копию строки в контексте верхнего исполнителя
SPI_returntuple — подготовка к возврату кортежа в качестве значения типа Datum
SPI_modifytuple — создание строки путем замены выбранных полей заданной строки
SPI_freetuple — освобождает строку, выделенную в контексте верхнего исполнителя
SPI_freetuptable — освобождает набор строк, созданный функцией SPI_execute или аналогичной функцией
SPI_freeplan — освобождает ранее сохраненный подготовленный оператор

Tantor BE выделяет память внутри контекстов памяти, которые предоставляют удобный способ управления выделениями, сделанными во многих разных местах, которые должны существовать в течение различного времени. Уничтожение контекста освобождает всю память, выделенную в нем. Таким образом, необходимо отслеживать отдельные объекты, чтобы избежать утечек памяти; вместо этого нужно управлять только относительно небольшим количеством контекстов. Функции 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, становится текущим контекстом. Все выделения, сделанные с помощью функций palloc, repalloc или утилит SPI (за исключением описанного в этом разделе), выполняются в этом контексте. Когда C-функция отключается от менеджера SPI (с помощью функции SPI_finish), текущий контекст восстанавливается в верхний контекст исполнителя, и все выделения, сделанные в контексте памяти C-функции, освобождаются и больше не могут быть использованы.