我的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