メモリを共有する
メモリを管理する:インデックス への移動
ここでは、メモリ マネージャを使用してメモリを共有する方法について説明します。
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 を記述します。 最初に初期化されたモジュールが、メモリ マネージャを共有化するモジュールになります。 それより後に初期化されたモジュールはすべて、最初のモジュールのメモリ マネージャを使用します。
- 最初に初期化されたモジュールが、メモリ マネージャを共有化するモジュールになります。 それより後に初期化されたモジュールはすべて、最初のモジュールのメモリ マネージャを使用します。
関連項目
- メモリ管理
- メモリ マネージャを構成する
- メモリ リークを登録する
- メモリ アドレス空間を拡張する
- メモリ使用状況を監視する
- RTL.SimpleShareMem サンプル アプリケーション