My MEX file http://en.wikipedia.org/wiki/MEX_file用 C++/CLI 编写并调用用 C# 编写的 DLL。
当 gcnew 一个对象时,当 mexFunction 返回时它不应该被垃圾收集吗?
它的引用应该丢失,但似乎没有任何垃圾收集......每次调用 mex 函数都会增加MATLAB http://en.wikipedia.org/wiki/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 文件那样进一步增加内存。
EDIT:
我回答了我自己的问题,罪魁祸首是mxArrayToString