PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

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 被调用时, 由 SPI_connect 创建的 C 函数私有上下文会成为 当前上下文。 由 palloc、 repalloc 或 SPI 工具函数 (除本节描述的例外)做出的所有分配都在这个上下文中进行。 当 C 函数从 SPI 管理器断开 (通过 SPI_finish)时, 当前上下文被恢复为上层执行器上下文, 并且在 C 函数内存上下文中做出的所有分配都被释放,不能再被 使用。