45.3. Управление памятью#
45.3. Управление памятью #
- SPI_palloc — выделить память в контексте верхнего исполнителя
- SPI_repalloc — перераспределить память в контексте верхнего исполнителя
- SPI_pfree — освобождение памяти в верхнем контексте исполнителя
- SPI_copytuple — создает копию строки в контексте верхнего исполнителя
- SPI_returntuple — подготовка к возврату кортежа в качестве значения типа Datum
- SPI_modifytuple — создание строки путем замены выбранных полей заданной строки
- SPI_freetuple — освобождает строку, выделенную в контексте верхнего исполнителя
- SPI_freetuptable — освобождает набор строк, созданный функцией
SPI_executeили аналогичной функцией - SPI_freeplan — освобождает ранее сохраненный подготовленный оператор
Tantor SE выделяет память внутри
контекстов памяти, которые предоставляют удобный способ
управления выделениями, сделанными во многих разных местах, которые должны
существовать в течение различного времени. Уничтожение контекста освобождает
всю память, выделенную в нем. Таким образом, необходимо
отслеживать отдельные объекты, чтобы избежать утечек памяти; вместо этого
нужно управлять только относительно небольшим количеством контекстов.
Функции 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-функции, освобождаются и больше не могут быть использованы.