# 47.3.内存管理

SPI_帕洛克-在上层执行器上下文中分配内存SPI_重新分配-在上层执行器上下文中重新分配内存SPI_普弗里-在上层执行器上下文中释放内存SPI_复制元组-在上层执行器上下文中复制一行SPI_返回元组-准备返回一个元组作为基准SPI_修改元组-通过替换给定行的选定字段来创建行SPI_自由元组-释放在上层执行器上下文中分配的行SPI_免费的-释放由创建的行集SPI_执行或者类似的功能SPI_自由计划-释放以前保存的准备好的语句

PostgreSQL在内存中分配内存记忆语境,它提供了一种方便的方法来管理在许多不同地方进行的分配,这些地方需要居住不同的时间。销毁上下文会释放其中分配的所有内存。因此,没有必要跟踪单个对象以避免内存泄漏;相反,只需要管理相对较少的上下文。帕洛克相关函数从“当前”上下文分配内存。

SPI_连接创建新的内存上下文并使其成为当前上下文。SPI_饰面恢复以前的当前内存上下文并销毁由创建的上下文SPI_连接。这些操作确保在C函数退出时回收在C函数内部进行的临时内存分配,避免内存泄漏。

但是,如果C函数需要返回已分配内存中的对象(例如按引用传递数据类型的值),则不能使用帕洛克,至少在连接到SPI时不会。如果您尝试,该对象将被释放SPI_饰面,并且您的C函数将无法可靠地工作。要解决此问题,请使用斯皮尤·帕洛克为返回对象分配内存。斯皮乌帕洛克在“上层执行器上下文”中分配内存,即在SPI_连接调用,这正是从C函数返回的值的正确上下文。本节中描述的其他几个实用程序函数也返回在上层执行器上下文中创建的对象。

什么时候SPI_连接调用,C函数的私有上下文,由SPI_连接,使其成为当前上下文。所有分配由帕洛克, 重新分配或SPI实用程序功能(本节中描述的除外)就是在这种情况下实现的。当C函数与SPI管理器断开连接时(通过SPI_饰面)当前上下文被恢复到上层执行器上下文,在C函数内存上下文中进行的所有分配都被释放,不能再使用。