外部インタフェース/API    

メモリ管理互換性の問題

パフォーマンス問題に注目すると、MATLAB内部のメモリ管理モデルに変更を行う必要があります。これらの変更は、MEX-ファイルAPIの将来の機能強化の準備となっています。

MATLAB 5.2のように、MATLABは左辺のリスト(plhs[])に出力されない任意のmxArrayにおいてMEX-ファイルの実行の最後にmxArrayのデストラクタmxDestroyArrayを暗示的に呼び出します。MATLABが誤って作成されたあるいは不適切に破棄されたmxArrayを検出した場合、ワーニングを発生します。

つぎの節で説明するワーニングを生成するMEX-ファイルのコードを修正することを強く推奨します。詳細は、「C言語MEX-ファイルの作成」の「メモリ管理」を参照してください。 .

不適切にmxArrayを破棄する

mxFreeを使ってmxArrayを破棄することはできません。

ワーニング   

ワーニングが発生する例   

つぎの例題では、mxFreeは配列オブジェクトを破棄しません。このオペレーションは、配列に関連する構造体のヘッダを開放しますが、MATLABは配列オブジェクトを破棄する必要があるかのように機能します。そのため、MATLABは配列オブジェクトを破棄しようとし、さらにそのプロセスで再度構造体のヘッダを開放しようとします。

解決法   

代わりにmxDestroyArrayを呼び出します。

セルまたは構造体のmxArrayを不適切に作成

mxSetCellまたはmxSetFieldprhs[]によってメンバ配列として呼び出すことはできません。

ワーニング   

ワーニングが発生する例   

つぎの例で、MEX-ファイルがリターンするとき、MATLABはセル配列全体を破棄します。これは、セルのメンバを含むので、MEX-ファイルの入力引数を暗示的に破棄します。これにより、右辺引数がテンポラリ配列である(リテラルの、または式の結果)場合、通常呼び出し側のワークスペースの破棄に関連する奇妙な結果が生じる場合があります。

解決法   

mxDuplicateArrayを使って右辺引数のコピーを作り、そのコピーをmxSetCell (またはmxSetFieldの引数として使います。たとえば、

テンポラリなmxArrayを不適切なデータで作成

APIルーチンによって割り当てられていないデータをもつmxArrayについてmxDestroyArrayを呼び出すことはできません。

ワーニング   

ワーニングが発生する例   

mxSetPr, mxSetPi, mxSetData, mxSetImagDataを呼び出し、mxCalloc, mxMalloc, mxReallocによって割り当てられていないメモリをデータブロック(第二引数)として指定する場合、MEX-ファイルがリターンするとき、MATLABは実数データのポインタと虚数データ(存在すれば)のポインタを開放しようとします。そのため、MATLABは、この例ではプログラムスタックからメモリを開放しようとします。これにより、MATLABが互換性のチェックの情報を一致させようとするときに、上記のワーニングを発生します。

解決法   

データポインタを設定するためにmxSetPrを使うよりも、正しいサイズでmxArrayを作成し、memcpyを使ってスタックデータをmxGetPrによって出力されるバッファにコピーします。

潜在的なメモリリーク

バージョン5.2以前は、API作成ルーチンを使ってmxArrayを作成し、mxSetPrを使ってデータのポインタを上書きする場合には、MATLABはオリジナルのメモリを開放していました。これは現在は行われません。

たとえば、

は、メモリが5*5*8バイトリークします。ここで、8バイトはdoubleのサイズです。

コードを変更してメモリリークを防ぐことができます。

あるいは、つぎのようにします。

最初の解決法のほうが効率的です。

同様のメモリリークは、mxSetPi, mxSetData, mxSetImagData, mxSetIr, mxSetJcを使ったときにも起こる場合があります。メモリリークを防ぐために、上記のようにこの問題に対応することができます。

MEX-ファイルは、自身のテンポラリ配列を破棄します

一般に、MEX-ファイルがテンポラリ配列を破棄し、テンポラリメモリをクリーンアップすることを推奨します。左辺のリストに出力されるものとmexGetArrayPtrによって出力するもの以外のすべてのmxArrayは、安全に破棄されます。この方法は、他のMATLAB APIアプリケーションとの整合性があります(例, 自動クリーンアップメカニズムをもたないMAT-ファイルアプリケーション、エンジンアプリケーション、MATLAB Compiler生成アプリケーション)。


 コンパイラとプラットフォーム固有の問題 その他の情報