SPI_execute
や類似の関数によって生成された行セットを解放する
<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関数固有のコンテキストが現在のコンテキストに作成されます。
palloc
、repalloc
、SPIユーティリティ関数(この章で説明されているものは除きます)によって作成される割り当ては全て、このコンテキスト内に作成されます。
C関数がSPIマネージャから(SPI_finish
経由で)切断した時、現在のコンテキストは上位エグゼキュータコンテキストに戻され、C関数のメモリコンテキスト内で割り当てられたメモリは全て解放され、二度と使用することができません。