Main Content

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 つのケースではそうはいきません。その場合、メモリ リークを回避するために自動クリーンアップ メカニズムが必要です。

メモリを管理するには、関数 mxCallocmxFree などの 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 を使用します。

参考

|

関連するトピック