我MEX文件是用C ++ / CLI,并呼吁在C#编写的DLL。
当gcnew'ing对象,应该不是被垃圾收集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