私のMEXファイルはC++/ CLIで記述されており、C#で記述されたDLLを呼び出します。
オブジェクトをgcnewする場合、mexFunctionが戻ったときにガベージコレクションを行うべきではありませんか?その参照は失われるはずですが、ガベージコレクションは行われていないようです... mex関数を呼び出すたびに、MATLABのメモリ割り当てが増加します(いいえ、メモリはMATLAB変数に使用されません)。
狭いスコープで大きなダミー値を作成してみましたが、MEXファイルをステップ実行すると、割り当てられて解放されたメモリを確認できます。しかし、mexFunction =(で作成されたメインオブジェクトではそうではありません
デストラクタとファイナライザで削除しようとしましたが、ガベージコレクトに取得できません。MATLABに戻るときに、管理対象メモリを解放するにはどうすればよいですか?
外部DLLファイラーは問題ではないと思います。説明のために、私はこのばかげたmexFunctionを作成しました:
public ref class Foo
{
public:
Foo()
{
Dictionary<int,String^>^ bar = gcnew Dictionary<int,String^>;
for(int i=0;i<10000000;i++)
{
bar->Add(i, "abcdefghijklmnopqrstuvxyz");
}
}
};
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, mxArray* prhs[])
{
Foo^ test = gcnew Foo();
}
これにより、MATLABのメモリが約300 MB増加しますが、その後の呼び出しでは、実際のMEXファイルのようにメモリがさらに増えることはありません。
編集:
私は自分の質問に答えました、犯人はmxArrayToStringでした