2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 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

45.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 建立的上下文。這些操作可確保在 C 函式退出時回收在 C 函式中進行的臨時記憶體分配,從而避免記憶體洩漏。

但是,如果您的 C 函式需要返回分配記憶體中的物件(例如,傳遞引用資料型別的返回值),則不能使用 palloc 分配該記憶體,至少在連線到 SPI 時不行。如果嘗試這樣做,物件將在 SPI_finish 中被釋放,您的 C 函式將無法可靠執行。要解決此問題,請使用 SPI_palloc 為返回物件分配記憶體。 SPI_palloc 在“上層執行器上下文”中分配記憶體,也就是說,當呼叫 SPI_connect 時當前存在的記憶體上下文,這正是從 C 函式返回值所需要的正確上下文。本節中描述的許多其他實用函式也返回在上層執行器上下文中建立的物件。

當呼叫 SPI_connect 時,由 SPI_connect 建立的 C 函式的私有上下文被設為當前上下文。由 pallocrepalloc 或 SPI 實用函式(本節所述情況除外)進行的所有分配都將在此上下文中進行。當 C 函式透過 SPI_finish 與 SPI 管理器斷開連線時,當前上下文將恢復為上層執行器上下文,並且在 C 函式記憶體上下文中進行的所有分配都將被釋放,不再可用。

提交更正

如果您在文件中看到任何不正確、與您在該功能上的實際經驗不符或需要進一步澄清的內容,請使用 此表格 報告文件問題。