支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

45.3. 内存管理 #

SPI_palloc — 在上层执行器上下文中分配内存
SPI_repalloc — 在上层执行器上下文中重新分配内存
SPI_pfree — 释放上层执行器上下文中的内存
SPI_copytuple — 在上层执行器上下文中复制一行
SPI_returntuple — 准备返回一个元组作为 Datum
SPI_modifytuple — 通过替换给定行的选定字段来创建一行
SPI_freetuple — 释放上层执行器上下文中分配的行
SPI_freetuptable — 释放由 SPI_execute 或类似函数创建的行集合
SPI_freeplan — 释放之前保存的预处理语句

PostgreSQL内存上下文中分配内存,这提供了一种方便的方法来管理在许多不同位置进行的分配,这些分配需要在不同的时间段内存在。销毁上下文会释放其中分配的所有内存。因此,不必跟踪单个对象以避免内存泄漏;相反,只需要管理相对少量的上下文。palloc 和相关函数从当前上下文中分配内存。

SPI_connect 创建一个新的内存上下文并使其成为当前上下文。SPI_finish 恢复之前的当前内存上下文,并销毁由 SPI_connect 创建的上下文。这些操作确保在您的 C 函数内部进行的临时内存分配在 C 函数退出时被回收,从而避免内存泄漏。

但是,如果您的 C 函数需要返回分配的内存中的对象(例如,按引用传递数据类型的值),则不能使用 palloc 分配该内存,至少在连接到 SPI 时不能这样。如果您尝试这样做,该对象将被 SPI_finish 释放,并且您的 C 函数将无法可靠地工作。为了解决这个问题,请使用 SPI_palloc 为您的返回对象分配内存。SPI_palloc上层执行器上下文中分配内存,也就是说,当调用 SPI_connect 时,当前内存上下文正是从 C 函数返回的值的正确上下文。本节中描述的其他一些实用程序函数也会返回在上层执行器上下文中创建的对象。

当调用 SPI_connect 时,由 SPI_connect 创建的 C 函数的私有上下文将成为当前上下文。由 pallocrepalloc 或 SPI 实用程序函数(本节中描述的除外)进行的所有分配都在此上下文中进行。当 C 函数断开与 SPI 管理器的连接(通过 SPI_finish)时,当前上下文将恢复为上层执行器上下文,并且在 C 函数内存上下文中进行的所有分配都将被释放,并且不能再使用。

提交更正

如果您在文档中看到任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用此表格报告文档问题。