SPI_execute
或類似函數建立的資料列集合 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 函數的私有上下文會成為目前的上下文。由 palloc
、repalloc
或 SPI 公用程式函數(除了本節中描述的以外)進行的所有分配都在此上下文中進行。當 C 函數從 SPI 管理器斷開連線時(透過 SPI_finish
),目前的上下文會還原到上層執行器上下文,並且在 C 函數記憶體上下文中進行的所有分配都會被釋放且無法再使用。
如果您在文件中看到任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來報告文件問題。