47.3. 内存 Management

PostgreSQL 在内存上下文中分配内存,这提供了一种方便的方法来 Management 在许多需要居住不同时间的不同地方进行的分配。销毁上下文将释放在其中分配的所有内存。因此,没有必要跟踪各个对象以避免内存泄漏。相反,只需要 Management 相对少量的上下文。 palloc和相关功能从“当前”上下文分配内存。

SPI_connect创建一个新的内存上下文并将其设为当前。 SPI_finish恢复先前的当前内存上下文,并销毁SPI_connect创建的上下文。这些操作可确保在 C 函数 Export 处回收在 C 函数内部进行的临时内存分配,从而避免内存泄漏。

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

调用SPI_connect时,将由SPI_connect创建的 C 函数的私有上下文作为当前上下文。 pallocrepalloc或 SPIUtil 功能(本节中所述除外)进行的所有分配均在此上下文中进行。当 C 函数(通过SPI_finish)从 SPIManagement 器断开连接时,当前上下文将还原到上级执行程序上下文,并且 C 函数内存上下文中进行的所有分配都将被释放并且无法再使用。