gpt4 book ai didi

c++ - Matlab 是否在 MEX/C 代码中阻止或拦截 free()

转载 作者:太空狗 更新时间:2023-10-29 21:19:08 25 4
gpt4 key购买 nike

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

最佳答案

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

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

此外,我建议以允许附加调试器的方式构建 MEX 文件。例如,如果您使用的是 Windows,则可以关注 these instructions让您直接在 Visual Studio 中构建,这使得调试变得容易(只需附加到正在运行的 MATLAB.exe)。


更新:处理您关于top 报告的内存的评论。您的 mex 文件使用的 C 运行时库与 MathWorks 用来实现它的 mxMallocmxFree 内存管理的库不同。请注意,free 会将内存返回到运行时库,而不是操作系统。因此,内存可能会在不同的时间使用不同的运行时库返回给操作系统。来自 Modern Memory Managment at ONLamp.com :

malloc does not normally return the freed memory to the operating system; it remains owned by the process until it terminates. The process can reuse it the next time it requests more memory, but other programs will not have access to it, even if no other memory is available. As a corollary, then, the memory footprint of a program is the size of the largest allocation(s) made at any one time.

减少分配给进程的内存块的大小是出了名的困难。参见 this answer .答案重申了这一点:“要将内存返回给操作系统,首先必须将这些大块之一分配的所有内存释放给运行时库。运行时库然后可以根据需要告诉操作系统释放那 block 内存。”也可以在那里查看其他答案。

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

如果这是一个真正的泄漏,你将无法取回这段内存。如果你推送你的系统,该内存应该返回到空闲池。但是,我不得不将此视为 mxMalloc 相对于 malloc 的优势,但我本人并未实际重现此效果。

关于c++ - Matlab 是否在 MEX/C 代码中阻止或拦截 free(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28349327/

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