我在为Matlab编译的MEX / C代码中有一个奇怪的情况。我使用malloc(...)
进行动态内存分配,并调用free(...)
来释放此内存。退出MEX例程后,我可以看到分配的内存根本没有释放。另一方面,如果我使用mxMalloc(...)
和mxFree(...)
,一切都很好。如果我照顾malloc(...)
,我认为free(...)
的使用不是禁止的。在Matlab规范中,我找不到任何关于拦截或阻止基本C库的信息。虽然有一些奇怪的帖子,比如在Matlab Central上。
答案 0 :(得分:3)
可以使用malloc
和free
(new
和delete[]
),如果需要,请不要忽略调用daellocation函数由于错误,例外mexErrMsgTxt
等而提前返回。请查看代码中的每个return
,try
/ catch
块和mexErrMsg*
。
如果您确定代码中没有错误,请尝试clear mex
,看看您是否得到了回忆。
另外,我建议以允许附加调试器的方式构建MEX文件。例如,如果您使用的是Windows,则可以按照these instructions直接在Visual Studio中进行构建,这样可以简化调试(只需连接到正在运行的MATLAB.exe)。
更新:解决有关top
报告的内存的评论。您的mex文件正在使用MathWorks用于实现mxMalloc
和mxFree
的内存管理的不同C运行时库。请注意,free
将内存返回到运行时库,而不是操作系统。结果,可以使用不同的运行时库在不同的时间将存储器返回到操作系统。来自Modern Memory Managment at ONLamp.com:
malloc
通常不会将释放的内存返回给操作系统;它一直归进程,直到它终止。该进程可以在下次请求更多内存时重用它,但即使没有其他内存可用,其他程序也无法访问它。作为必然结果,程序的内存占用量是任何时候最大分配的大小。
众所周知,减少分配给进程的内存块的大小是非常困难的。见this answer。答案重申了这一点:"要将内存返回给操作系统,首先必须将从这些大块中的一个分配的所有内存释放到运行时库。然后运行时库可以,如果需要,告诉操作系统释放那块内存。"在那里也可以看到其他答案。
因此,当top
执行时free
报告的驻留集大小(RSS / RES)不会立即下降也就不足为奇了。 MATLAB内部使用的malloc
明显不同于mex文件中使用的mxMalloc
,甚至可能是自定义实现而不是标准运行时版本。
如果是实际泄漏,你就不会得到这个记忆。如果您推送系统,该内存应返回到空闲池。但是,我必须将此视为malloc
优于{{1}}的好处,并且免责声明我自己并未真正复制此效果。