gpt4 book ai didi

matlab - MATLAB > MEX 文件 > 托管 DLL 中的内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-03 20:26:19 25 4
gpt4 key购买 nike

我的 MEX file用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

最佳答案

垃圾收集将内存标记为在 .NET 堆中可用。它不会缩小 .NET 堆(这将使内存可供其他进程使用,地址空间可供进程中的非 .NET 代码使用)。

明确记录了大对象堆永远不会缩小,具有 1000 万个条目的字典可能大到足以进入 LOH。

关于matlab - MATLAB > MEX 文件 > 托管 DLL 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12496549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com