SPI_execute
或类似函数创建的行集 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 函数的私有上下文变为当前上下文。palloc
、repalloc
或 SPI 实用程序函数(本部分中描述的除外)所做的所有分配都将在该上下文中执行。当 C 函数与 SPI 管理器断开连接(通过 SPI_finish
)后,将把当前上下文还原至“上级执行器上下文”,并释放 C 函数内存上下文中所有已做分配且不再可用的资源。