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-функции, освобождаются и больше не могут быть использованы.