On this page
47.3. 内存 Management
SPI_palloc —在上级执行程序上下文中分配内存
SPI_repalloc —在上层执行程序上下文中重新分配内存
SPI_pfree —上级执行程序上下文中的可用内存
SPI_copytuple —在上级执行者上下文中复制一行
SPI_returntuple —准备返回 Tuples 作为基准
SPI_modifytuple-通过替换给定行的选定字段来创建行
SPI_freetuple —释放在上级执行者上下文中分配的行
SPI_freetuptable-释放由
SPI_execute
或类似功能创建的行集SPI_freeplan —释放以前保存的准备好的语句
PostgreSQL 在内存上下文中分配内存,这提供了一种方便的方法来 Management 在许多需要居住不同时间的不同地方进行的分配。销毁上下文将释放在其中分配的所有内存。因此,没有必要跟踪各个对象以避免内存泄漏。相反,只需要 Management 相对少量的上下文。 palloc
和相关功能从“当前”上下文分配内存。
SPI_connect
创建一个新的内存上下文并将其设为当前。 SPI_finish
恢复先前的当前内存上下文,并销毁SPI_connect
创建的上下文。这些操作可确保在 C 函数 Export 处回收在 C 函数内部进行的临时内存分配,从而避免内存泄漏。
但是,如果您的 C 函数需要在分配的内存中返回一个对象(例如,传递引用数据类型的值),则不能使用palloc
来分配该内存,至少在连接 SPI 时不可以。如果尝试,该对象将被SPI_finish
释放,并且您的 C 函数将无法可靠地工作。要解决此问题,请使用SPI_palloc
为您的返回对象分配内存。 SPI_palloc
在“上层执行程序上下文”中分配内存,即在调用SPI_connect
时当前的内存上下文,这恰好是从 C 函数返回的值的正确上下文。本节中描述的其他一些 Util 功能还返回在上层执行程序上下文中创建的对象。
调用SPI_connect
时,将由SPI_connect
创建的 C 函数的私有上下文作为当前上下文。 palloc
,repalloc
或 SPIUtil 功能(本节中所述除外)进行的所有分配均在此上下文中进行。当 C 函数(通过SPI_finish
)从 SPIManagement 器断开连接时,当前上下文将还原到上级执行程序上下文,并且 C 函数内存上下文中进行的所有分配都将被释放并且无法再使用。