On this page
46.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
创建的上下文。这些操作可确保在过程 Export 处回收在过程中进行的临时内存分配,从而避免内存泄漏。
但是,如果您的过程需要在分配的内存中返回一个对象(例如,按引用数据类型的值),则不能使用palloc
分配该内存,至少在连接 SPI 时不能如此。如果尝试,该对象将被SPI_finish
释放,并且过程将无法可靠地运行。要解决此问题,请使用SPI_palloc
为您的返回对象分配内存。 SPI_palloc
在“上级执行程序上下文”中分配内存,即在调用SPI_connect
时当前的内存上下文,这恰好是从过程返回的值的正确上下文。本节中描述的其他一些 Util 过程也返回在上层执行程序上下文中创建的对象。
调用SPI_connect
时,由SPI_connect
创建的过程的私有上下文将成为当前上下文。 palloc
,repalloc
或 SPIUtil 功能(本节中所述除外)进行的所有分配均在此上下文中进行。当过程与 SPIManagement 器断开连接(通过SPI_finish
)时,当前上下文将还原到上级执行者上下文,并且在过程存储器上下文中进行的所有分配都将被释放并且无法再使用。