MEX ファイルでの一時配列の自動クリーンアップ
MEX 関数から MATLAB® に制御が戻るとき、左辺の引数 plhs[]
に含まれる出力引数 mxArray
に計算の結果が返されます。これらの配列には一時的なスコープがなければならないので、関数 mexMakeArrayPersistent
で作成された配列を plhs
には渡さないでください。MATLAB は、plhs
内にない MEX 関数によって作成された mxArray
があれば、それを破棄します。MATLAB は、関数 mxCalloc
、関数 mxMalloc
または関数 mxRealloc
を使用して MEX 関数に割り当てられたメモリもすべて解放します。
MathWorks® では、MEX 関数が独自の一時的な配列を破棄し、動的に割り当てられた独自のメモリを解放することを推奨します。自動メカニズムに依存するより、ソース MEX ファイルでこのクリーンアップを実行する方がより効率的です。しかし、MEX 関数が正常な return ステートメントに到達しない状況がいくつかあります。
以下のような状況では正常な復帰に到達しません。
MATLAB で
mexCallMATLAB
を呼び出し、呼び出される関数がエラーを生じる場合 (ソース MEX ファイルは関数mexCallMATLABWithTrap
を使用してそのようなエラーをトラップできますが、すべての MEX ファイルがエラーをトラップする必要があるとは限りません)。ユーザーが Ctrl + C を使用して MEX 関数の実行に割り込む場合。
MEX 関数がメモリ不足になった場合。MATLAB の out-of-memory ハンドラーにより MEX 関数が終了します。
最初のケースについては、MEX プログラマが制御を戻す前に一時的な配列とメモリを安全にクリーンアップするようにできますが、後の 2 つのケースではそうはいきません。その場合、メモリ リークを回避するために自動クリーンアップ メカニズムが必要です。
メモリを管理するには、関数 mxCalloc
や mxFree
などの MATLAB に用意されている関数を使用しなければなりません。同等の機能をもつ標準 C ライブラリは使用しないでください。使用するとプログラム終了を含む、予期しない結果が発生します。
例
この例では、MEX 関数の変数にメモリを割り当てる方法を説明します。たとえば、関数への最初の入力 (prhs[0]
) が文字列である場合、その文字列を操作するには、サイズ buflen
のバッファー buf
を作成します。次のステートメントは、これらの値を宣言します。
char *buf; int buflen;
バッファーのサイズは、入力配列の次元の数および配列内のデータのサイズによって異なります。次のステートメントは、buflen
のサイズを計算します。
buflen = mxGetN(prhs[0])*sizeof(mxChar)+1;
次に、buf
にメモリを割り当てます。
buf = mxMalloc(buflen);
プログラムの最後に plhs
出力パラメーターとして buf
を返さない場合、以下のようにメモリを解放します。
mxFree(buf);
MEX 関数を終了する前に、一時的な配列を破棄して動的に割り当てられたメモリを解放します。ただし、そのような mxArray
が出力引数リストで返される場合や関数 mexGetVariablePtr
で返される場合、あるいは構造体の作成に使用されている場合などは除きます。また、入力引数は決して削除しないでください。
関数 mxCalloc
、関数 mxMalloc
または関数 mxRealloc
によって割り当てられたメモリを解放するには、関数 mxFree
を使用します。関数 mxCreate*
によって割り当てられたメモリを解放するには、関数 mxDestroyArray
を使用します。