支援的版本:目前 (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 — 準備將一個 Tuple 作為 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 管理器斷開連線時(透過 SPI_finish),目前的上下文會還原到上層執行器上下文,並且在 C 函數記憶體上下文中進行的所有分配都會被釋放且無法再使用。

提交更正

如果您在文件中看到任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來報告文件問題。