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
时,C 函数的私有上下文(由 SPI_connect
创建)将成为当前上下文。由 palloc
、repalloc
或 SPI 实用程序函数(除非在本节中所述)进行的所有分配都将在此上下文中进行。当 C 函数从 SPI 管理器断开连接(通过 SPI_finish
)时,当前上下文将恢复为上层执行器上下文,并且在 C 函数内存上下文中进行的所有分配都将被释放,并且无法再使用。
如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用此表单 报告文档问题。