↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
历史版本。 PostgreSQL 8.3 已结束支持。 请参阅 当前版本手册.

42.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 创建的上下文。这些操作可以确保在过程内部所做的临时内存分配会在过程退出时被回收,从而避免内存泄漏。

不过,如果过程需要返回位于已分配内存中的对象(例如传引用数据类型的值),就不能使用 palloc 来分配这块内存,至少在连接到 SPI 的期间不能这么做。否则,该对象会在 SPI_finish 时被释放,过程也就无法可靠工作。解决办法是用 SPI_palloc 为返回对象分配内存。SPI_palloc 在“上层执行器上下文”中分配内存,也就是调用 SPI_connect 时的当前内存上下文;这正是从过程返回值最合适的上下文。

如果在过程尚未连接到 SPI 时调用SPI_palloc,它的行为与普通的palloc相同。在过程连接到 SPI 管理器之前,当前内存上下文就是上层执行器上下文,因此过程通过palloc或 SPI 辅助函数所做的所有分配都位于这个上下文中。

调用 SPI_connect 时,会把该过程的私有上下文(由 SPI_connect 创建)设为当前上下文。所有通过 palloc、repalloc 或 SPI 辅助函数分配的内存(但SPI_copytuple、SPI_returntuple、SPI_modifytuple 和SPI_palloc除外)都位于这个上下文中。当过程通过 SPI_finish 与 SPI 管理器断开连接时,当前上下文会恢复为上层执行器上下文,而在该过程内存上下文中分配的所有内存都会被释放,之后就不能再使用。

本节介绍的所有函数既可由已连接的过程使用,也可由未连接的过程使用。在未连接的过程中,它们的行为与底层普通服务器函数(palloc等)相同。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.