2012-02-08 9 views
0

私はMATLABのmxDestroyArray() functionを使用して、適切なエラー処理を行う方法を知りました。MATLAB C API:mxDestroyArray(NULL)とは何ですか?

私がmxCreate*Array()と呼んだ場合やそれと似たような場合は、成功した場合には有効なポインタを取得し、失敗した場合はNULLを返します。 e。メモリがいっぱいの場合。

このように複数の配列を作成し、少なくとも1つが失敗した場合は、もう必要のないものをすべて解放します。

私は疑問に思っています。すべての値を明示的にチェックする必要がありますか?

if (error) { 
    if (a) mxDestroyArray(a); 
    if (b) mxDestroyArray(b); 
    if (c) mxDestroyArray(c); 
} 

または私はちょうどチェックを省略することができますか?

if (error) { 
    mxDestroyArray(a); 
    mxDestroyArray(b); 
    mxDestroyArray(c); 
} 
+0

私は確信していませんが、十分なメモリがない場合、matlabはあなたのmexファイルから直接外に出ます。その場合、おそらく例外や何かをキャッチすることができます...とにかく、Mathworksによってコード化されたmexファイルを見るには、 'edit([matlabroot '/extern/examples/refbook/matrixDivideComplex.c']);' 'mxDestroyArray'を呼び出す前に特別なことはしません。 – Oli

+0

@Oli mexファイルの場合、あなたは正しいです。しかし、外部プログラムからMATLABを呼び出すという方向性もあります。これは現在私の問題です。そして、あなたはNULLを得ることができます。 – glglgl

答えて

2

matlabがクラッシュするかどうか試してみてください。 nullは有効なメモリアドレスを参照していないので、チェックが必要だと思います。

+0

無料()の場合、私は小切手が必要ありません。これは非常に便利です。チェックのために:問題は、それが今働く場合、それがそれ以降のバージョンでも動作するという保証はありません。それでも、明日チェックします。 – glglgl

+0

私はちょうどテストし、プログラムはクラッシュしませんでした。だから私はそれが動作すると思います。それにもかかわらず、私は今のところそれを維持していきます... – glglgl

2

私はこれが必要ではないと思います。理由:

  1. mxCreate *関数の呼び出しに失敗した場合は、メモリ不足の可能性が高いです。 MEX APIの一部のバージョンでは、これはセグメンテーション違反となり、とにかくクリーンアップを実行する機会はありません。

  2. MEX関数が終了したとき、またはmxErrが呼び出されたときに、MATLABはplhs []のMEX関数から返されなかった配列を自動的に破棄します。

+0

私は他の方向について考えています:外部からMATLABを呼び出してください。そして、ここで何も破壊されません。私のプログラムが数日間実行される必要があるため、メモリリークを完全に回避しようとします。 – glglgl

関連する問題