バージョンごとのドキュメント一覧

45.3. メモリ管理 #

SPI_palloc — 上位エグゼキュータコンテキスト内にメモリを割り当てる
SPI_repalloc — 上位エグゼキュータコンテキスト内にメモリを再割り当てる
SPI_pfree — 上位エグゼキュータコンテキスト内のメモリを解放する
SPI_copytuple — 上位エグゼキュータ内に行のコピーを作成する
SPI_returntuple — Datumとしてタプルを返す準備をする
SPI_modifytuple — 与えられた行の選択フィールドを置き換えた行を作成する
SPI_freetuple — 上位エグゼキュータコンテキスト内に割り当てられた行を解放する
SPI_freetuptableSPI_executeや類似の関数によって生成された行セットを解放する
SPI_freeplan — 以前に保存した準備済み文を解放する
<title>Memory Management</title>

<productname>PostgreSQL</productname> allocates memory within <firstterm>memory contexts</firstterm>, which provide a convenient method of managing allocations made in many different places that need to live for differing amounts of time. Destroying a context releases all the memory that was allocated in it. Thus, it is not necessary to keep track of individual objects to avoid memory leaks; instead only a relatively small number of contexts have to be managed. <function>palloc</function> and related functions allocate memory from the <quote>current</quote> context. PostgreSQLは、メモリコンテキスト内にメモリを確保します。 これは、様々な場所で、必要な有効期間がそれぞれ異なるような割り当てを管理する便利な方法を提供します。 コンテキストを破壊することで、そこで割り当てられた全てのメモリを解放します。 したがって、メモリリークを防ぐための個々のオブジェクトの追跡を維持することは不要です。 その代わり、相対的に少量のコンテキストを管理する必要があります。 pallocと関連する関数は現在のコンテキストからメモリを確保します。

<function>SPI_connect</function> creates a new memory context and makes it current. <function>SPI_finish</function> restores the previous current memory context and destroys the context created by <function>SPI_connect</function>. These actions ensure that transient memory allocations made inside your C function are reclaimed at C function exit, avoiding memory leakage. SPI_connectは新しくメモリコンテキストを作成し、それを現在のコンテキストとします。 SPI_finishは直前の現在のメモリコンテキストを戻し、SPI_connectで作成されたコンテキストを破壊します。 これらの動作により、C関数内で割り当てが行われる一時的なメモリがC関数の終了時に回収され、メモリリークが防止されることが保証されます。

However, if your C function needs to return an object in allocated memory (such as a value of a pass-by-reference data type), you cannot allocate that memory using <function>palloc</function>, at least not while you are connected to SPI. If you try, the object will be deallocated by <function>SPI_finish</function>, and your C function will not work reliably. To solve this problem, use <function>SPI_palloc</function> to allocate memory for your return object. <function>SPI_palloc</function> allocates memory in the <quote>upper executor context</quote>, that is, the memory context that was current when <function>SPI_connect</function> was called, which is precisely the right context for a value returned from your C function. Several of the other utility functions described in this section also return objects created in the upper executor context. しかし、(参照渡しのデータ型の値といった)C関数が割り当てられたメモリ内のオブジェクトを返す必要がある場合、少なくともSPIに接続していない期間は、pallocを使用してメモリを確保することができません。 これを試行すると、そのオブジェクトはSPI_finishで解放されてしまい、C関数は正しく動作しないでしょう。 この問題を解決するには、SPI_pallocを使用して、戻り値となるオブジェクト用のメモリを確保してください。 SPI_palloc上位エグゼキュータコンテキスト内にメモリを割り当てます。 このメモリコンテキストは、SPI_connectが呼び出された時点において現在のコンテキストだったものであり、C関数の戻り値用のコンテキストとしてまさに正しいものです。 この章で説明されているほかのユーティリティ関数のいくつかも、上位エグゼキュータコンテキスト内で作成されたオブジェクトを返します。

When <function>SPI_connect</function> is called, the private context of the C function, which is created by <function>SPI_connect</function>, is made the current context. All allocations made by <function>palloc</function>, <function>repalloc</function>, or SPI utility functions (except as described in this section) are made in this context. When a C function disconnects from the SPI manager (via <function>SPI_finish</function>) the current context is restored to the upper executor context, and all allocations made in the C function memory context are freed and cannot be used any more. SPI_connectが呼び出されると、SPI_connectによって作成されるC関数固有のコンテキストが現在のコンテキストに作成されます。 pallocrepalloc、SPIユーティリティ関数(この章で説明されているものは除きます)によって作成される割り当ては全て、このコンテキスト内に作成されます。 C関数がSPIマネージャから(SPI_finish経由で)切断した時、現在のコンテキストは上位エグゼキュータコンテキストに戻され、C関数のメモリコンテキスト内で割り当てられたメモリは全て解放され、二度と使用することができません。

*********************************************** *********************************************** *********************************************** *********************************************** *********************************************** *********************************************** *********************************************** *********************************************** ***********************************************