2024年9月26日:PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:开发版
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

45.3. 内存管理 #

SPI_palloc —— 在上层执行器上下文分配内存
SPI_repalloc —— 在上层执行器上下文重新分配内存
SPI_pfree —— 在上层执行器上下文释放内存
SPI_copytuple —— 在上层执行器上下文中复制一行
SPI_returntuple —— 准备将元组作为 Datum 返回
SPI_modifytuple —— 通过替换给定行的选定字段来创建一行
SPI_freetuple —— 释放在上层执行器上下文中分配的行
SPI_freetuptable —— 释放由 SPI_execute 或类似函数创建的行集
SPI_freeplan —— 释放之前保存的已准备好的语句

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 创建)将成为当前上下文。由 pallocrepalloc 或 SPI 实用程序函数(除非在本节中所述)进行的所有分配都将在此上下文中进行。当 C 函数从 SPI 管理器断开连接(通过 SPI_finish)时,当前上下文将恢复为上层执行器上下文,并且在 C 函数内存上下文中进行的所有分配都将被释放,并且无法再使用。

提交更正

如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用此表单 报告文档问题。