Matlab是否阻止或拦截MEX / C代码中的free()

时间:2015-02-05 16:39:28

标签: c++ c matlab memory-management mex

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

1 个答案:

答案 0 :(得分:3)

可以使用mallocfreenewdelete[]),如果需要,请不要忽略调用daellocation函数由于错误,例外mexErrMsgTxt等而提前返回。请查看代码中的每个returntry / catch块和mexErrMsg*

如果您确定代码中没有错误,请尝试clear mex,看看您是否得到了回忆。

另外,我建议以允许附加调试器的方式构建MEX文件。例如,如果您使用的是Windows,则可以按照these instructions直接在Visual Studio中进行构建,这样可以简化调试(只需连接到正在运行的MATLAB.exe)。


更新:解决有关top报告的内存的评论。您的mex文件正在使用MathWorks用于实现mxMallocmxFree的内存管理的不同C运行时库。请注意,free将内存返回到运行时库,而不是操作系统。结果,可以使用不同的运行时库在不同的时间将存储器返回到操作系统。来自Modern Memory Managment at ONLamp.com

  

malloc通常不会将释放的内存返回给操作系统;它一直归进程,直到它终止。该进程可以在下次请求更多内存时重用它,但即使没有其他内存可用,其他程序也无法访问它。作为必然结果,程序的内存占用量是任何时候最大分配的大小。

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

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

如果是实际泄漏,你就不会得到这个记忆。如果您推送系统,该内存应返回到空闲池。但是,我必须将此视为malloc优于{{1}}的好处,并且免责声明我自己并未真正复制此效果。