Matlab在MEX/C代码中阻止或拦截free()吗
Does Matlab blocks or intercepts free() in MEX/C-code
我在为Matlab编译的MEX/C代码中遇到了一个奇怪的情况。我使用malloc(...)
进行动态内存分配,并调用free(...)
来解除分配此内存。退出MEX例程后,我可以看到分配的内存根本没有释放。另一方面,如果我使用mxMalloc(...)
和mxFree(...)
,一切都很好。如果我照顾free(...)
,我认为malloc(...)
的使用是不禁止的。在Matlab规范中,我找不到任何关于拦截或阻塞基本C库的内容。尽管有一些奇怪的帖子,比如在Matlab Central上。
使用malloc
和free
(也可以使用new
和delete[]
),但如果由于错误、异常、mexErrMsgTxt
等原因需要提前返回,请不要忽略首先调用daellocation函数。查看代码中的每个return
、try
/catch
块和mexErrMsg*
。
如果您确信代码中没有错误,请尝试clear mex
以查看是否恢复了内存。
此外,我建议以允许附加调试器的方式构建MEX文件。例如,如果你在Windows上,你可以按照这些说明直接在Visual Studio中构建,这使得调试变得很容易(只需连接到运行的MATLAB.exe)
更新:处理您对top
报告的内存的评论。您的mex文件使用的C运行库与用于实现mxMalloc
和mxFree
内存管理的MathWorks不同。请注意,free
将内存返回到运行库,而不是操作系统。结果,可以在不同的时间使用不同的运行库将内存返回到操作系统。来自ONLamp.com的现代内存管理:
CCD_ 21通常不会将释放的内存返回给操作系统;它仍然由进程拥有,直到它终止。进程可以在下次请求更多内存时重用它,但即使没有其他内存可用,其他程序也无法访问它。因此,作为推论,程序的内存占用是在任何时候进行的最大分配的大小。
众所周知,减少分配给进程的内存块的大小是困难的。看看这个答案。答案重申了这一点:"要将内存返回到操作系统,首先必须将从这些大块中分配的所有内存释放到运行库。然后,如果运行库愿意,它可以告诉操作系统释放那块内存。"请参阅其他答案。
因此,当free
执行时,由top
报告的驻留集大小(RSS/RES)不会立即下降也就不足为奇了。MATLAB内部使用的malloc
与mex文件中使用的明显不同,甚至可能是自定义实现,而不是标准运行时版本。
如果这是一次真正的泄漏,你就无法取回这些内存。如果您推送您的系统,那么内存应该会返回到可用池中。然而,我不得不将此视为mxMalloc
相对于malloc
的好处,并免责声明我本人并未实际复制此效果。
- 尝试构建"lock-free"数据结构C++
- 使用 MEX 编译C++文件
- 调用 free() 有时会导致程序崩溃
- Valgrind 大小为 8 且地址 0x5b7e520 的读取无效,在大小为 16 的块内为 0 字节 free'd
- 为什么 free() 函数不将内存返回给操作系统?
- "fast"或"normal"在"free(): invalid next size (fast)"中是什么意思?
- 逻辑'double free or corruption (fasttop)'错误
- emplace_back和push_back给出错误'double free or corruption (fasttop)'尽管定义了复制和移动构造函数
- 当我运行MEX文件时,MATLAB崩溃
- ASIOSDK;从hostsample.cpp生成mex文件时出错
- free():在有效指针异常中-使用流读取巨大文件时
- C-Free and MySQL connect
- 为什么FREE块堆这么大
- std::free线程安全吗
- 为什么'allocate in one library and free in the other'是错误的
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 为什么这段代码(在 Matlab 的 MEX 文件中使用 OpenMP)给出不同的结果?
- 不断得到分段错误和free()无效指针
- C++: free(): 无效的下一个大小(快速)
- Matlab在MEX/C代码中阻止或拦截free()吗