Matlab在MEX/C代码中阻止或拦截free()吗

Does Matlab blocks or intercepts free() in MEX/C-code

本文关键字:free MEX 代码 Matlab      更新时间:2023-10-16

我在为Matlab编译的MEX/C代码中遇到了一个奇怪的情况。我使用malloc(...)进行动态内存分配,并调用free(...)来解除分配此内存。退出MEX例程后,我可以看到分配的内存根本没有释放。另一方面,如果我使用mxMalloc(...)mxFree(...),一切都很好。如果我照顾free(...),我认为malloc(...)的使用是不禁止的。在Matlab规范中,我找不到任何关于拦截或阻塞基本C库的内容。尽管有一些奇怪的帖子,比如在Matlab Central上。

使用mallocfree(也可以使用newdelete[]),但如果由于错误、异常、mexErrMsgTxt等原因需要提前返回,请不要忽略首先调用daellocation函数。查看代码中的每个returntry/catch块和mexErrMsg*

如果您确信代码中没有错误,请尝试clear mex以查看是否恢复了内存。

此外,我建议以允许附加调试器的方式构建MEX文件。例如,如果你在Windows上,你可以按照这些说明直接在Visual Studio中构建,这使得调试变得很容易(只需连接到运行的MATLAB.exe)


更新:处理您对top报告的内存的评论。您的mex文件使用的C运行库与用于实现mxMallocmxFree内存管理的MathWorks不同。请注意,free将内存返回到运行库,而不是操作系统。结果,可以在不同的时间使用不同的运行库将内存返回到操作系统。来自ONLamp.com的现代内存管理:

CCD_ 21通常不会将释放的内存返回给操作系统;它仍然由进程拥有,直到它终止。进程可以在下次请求更多内存时重用它,但即使没有其他内存可用,其他程序也无法访问它。因此,作为推论,程序的内存占用是在任何时候进行的最大分配的大小。

众所周知,减少分配给进程的内存块的大小是困难的。看看这个答案。答案重申了这一点:"要将内存返回到操作系统,首先必须将从这些大块中分配的所有内存释放到运行库。然后,如果运行库愿意,它可以告诉操作系统释放那块内存。"请参阅其他答案。

因此,当free执行时,由top报告的驻留集大小(RSS/RES)不会立即下降也就不足为奇了。MATLAB内部使用的malloc与mex文件中使用的明显不同,甚至可能是自定义实现,而不是标准运行时版本。

如果这是一次真正的泄漏,你就无法取回这些内存。如果您推送您的系统,那么内存应该会返回到可用池中。然而,我不得不将此视为mxMalloc相对于malloc的好处,并免责声明我本人并未实际复制此效果。