46.3. 内存 Management

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

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

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

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