メモリを共有する
メモリを管理する:インデックス への移動
ここでは、メモリ マネージャを使用してメモリを共有する方法について説明します。
Win32 および Win64 では、長い文字列や動的配列をパラメータや関数の結果として渡すルーチン(直接渡すかレコードやオブジェクトにネストさせるかを問わない)が DLL からエクスポートされる場合は、その DLL とその DLL のクライアント アプリケーション(またはクライアント DLL)はすべて同じメモリ マネージャを共有する必要があります。一方のアプリケーションまたは DLL で System.New または System.GetMem を使ってメモリを割り当て、それをもう一方のモジュールで System.Dispose または System.FreeMem を呼び出して割り当て解除する場合も同様です。アプリケーションとそのライブラリの間でメモリ マネージャを共有する手段として、ShareMem および SimpleShareMem という 2 つの相互排他的なメソッドがあります。
Posix では、アプリケーションと共有ライブラリは既に、malloc、free、realloc などの System ライブラリを共用しています。
メモ:DLL がアプリケーションに静的にリンクされている場合、その DLL はアプリケーションの前に初期化されます。SimpleShareMem 共有メソッドがアプリケーションと DLL の両方で使われている場合、アプリケーションは DLL のメモリ マネージャを使用します。メモリ マネージャの設定を変更したり、メモリ マネージャの統計を取得できるのは、メモリ マネージャを共有化しているモジュールだけです。それ以外のモジュールから設定を変更しても無効です。そのモジュールのメモリ マネージャが使われている訳ではないからです。ただし、滅多に必要にはなりませんが、メモリ マネージャの共有メカニズムを手動で制御することもできます。
ShareMem を使用するには:
- プログラムやライブラリが使用する句の先頭に ShareMem を記述します。モジュールは、外部の BORLNDMM.DLL ライブラリに依存するようになります。これによって、割り当てられたメモリを動的に共有できるようになります。
- BORLNDMM.DLL は、ShareMem を使用するアプリケーションや DLL と一緒に配置します。アプリケーションまたは DLL が ShareMem を使用すると、そのメモリ マネージャは BORLANDMM.DLL 内のメモリ マネージャによって置き換えられます。
SimpleShareMem を使用するには:
- 各モジュール内のプログラムやライブラリが使用する句の先頭に SimpleShareMem を記述します。最初に初期化されたモジュールが、メモリ マネージャを共有化するモジュールになります。それより後に初期化されたモジュールはすべて、最初のモジュールのメモリ マネージャを使用します。
- 最初に初期化されたモジュールが、メモリ マネージャを共有化するモジュールになります。それより後に初期化されたモジュールはすべて、最初のモジュールのメモリ マネージャを使用します。