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 函数内存上下文中进行的所有分配都将被释放,并且不能再使用。
如果您在文档中看到任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用此表格报告文档问题。