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 函数内存上下文中做出的所有分配都被释放,不能再被
使用。