在MATLAB> MEX文件中的内存泄漏>管理DLL(Memory leak in MA

2019-09-22 14:50发布

我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

Answer 1:

垃圾收集标记为可用的.NET堆内存里面。 它不会收缩.NET堆(这将使内存可用于其他的流程和过程中提供给非.NET代码的地址空间)。

它明确地记载了大对象堆从不缩水,1000万个条目的解释可能是足够大,去到LOH。



Answer 2:

我发现这个问题,原来它不是.NET后,所有相关的...对不起红鲱鱼

因为我没有使用新的malloc或mxMalloc我错误地认为我所有的非托管内存将在堆栈和清理时mexFunction结束。

然而mxArrayToString不返回一个指针到MATLAB数据mxGetData等MX *功能做。 它复制数据到堆和一个有来电mxFree将其释放。 我用mxArrayToString作为输入来创建一个系统:字符串^,唯一需要的变化是保存temporay字符指针,使用的字符串^构造函数,然后mxFree它。

所以再次SEO一次:从mxArrayToString指针必须mxFree'd!



文章来源: Memory leak in MATLAB > MEX file > managed DLL