Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

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 函数内存上下文中所有已做分配且不再可用的资源。