- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在为 Matlab 编译的 MEX/C 代码中遇到了一个奇怪的情况。我使用 malloc(...)
进行动态内存分配,并调用 free(...)
来释放该内存。退出 MEX 例程后,我可以看到分配的内 stub 本没有释放。另一方面,如果我使用 mxMalloc(...)
和 mxFree(...)
一切都很好。如果我处理好 free(...)
,我假设 malloc(...)
的使用不是禁止的。在 Matlab 规范中,我找不到任何关于拦截或阻止基本 C 库的信息。虽然有一些关于它的奇怪帖子,比如 Matlab Central .
最佳答案
可以使用malloc
和free
(new
和delete[]
),只是不要如果由于错误、异常、mexErrMsgTxt
等原因需要提前返回,请不要忽略先调用 daellocation 函数。查看每个return
,try
/catch
block ,以及代码中的 mexErrMsg*
。
如果您确定您的代码中没有错误,请尝试 clear mex
看看您是否恢复了内存。
此外,我建议以允许附加调试器的方式构建 MEX 文件。例如,如果您使用的是 Windows,则可以关注 these instructions让您直接在 Visual Studio 中构建,这使得调试变得容易(只需附加到正在运行的 MATLAB.exe)。
更新:处理您关于top
报告的内存的评论。您的 mex 文件使用的 C 运行时库与 MathWorks 用来实现它的 mxMalloc
和 mxFree
内存管理的库不同。请注意,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/
我刚开始使用新的拦截方法,有一个基本问题,想知道如何在一个测试中链接下面的两个断言。 cy.intercept('GET', '/states').as('states'); cy.reload(tr
我有一个标签控件的自定义版本(使用用户控件构建)。在设计器中工作时,我想截取 Name 属性的设置(在属性面板中)并使用它来生成 Text 属性。也就是说,如果我在属性面板的 Name 属性中输入“l
嗨,我想通过 soapUI 解析 ssl soap 消息,而我试图通过 HttpMonitor 进行拦截它显示在异常下方 ERROR:Exception in request: javax.net.s
是否有可能从某个任意层拦截反向梯度,修改其值并继续反向传播回到网络的开始,根据您提供的修改后的梯度值更新所有先前层的反向梯度? 我知道你可以directly modify the gradients
我可以从什么 dll 中获得 Intercept 的扩展?我从 http://github.com/danielmarbach/ninject.extensions.interception 添加了
我有一个实现 onCreateOptionsMenu 方法的顶级 TabHost。我希望子 Activity (选项卡内的子 Activity )能够通过 onOptionsItemSelected
我在尝试反序列化 URL 时遇到此错误 Caused by: java.net.MalformedURLException: no protocol: www.boo.com at java.
首先,我是 Spring 的新手,这是我第一次尝试使用 Spring 编写基于 REST 的应用程序。 我计划在请求参数和响应中使用 Json。这让我想到两个问题。 有没有办法将 products="
在我基于 j_security_check 的登录表单中登录时一切正常。在这种情况下,我看到 JSESSIONID cookie 中的路径具有来自 URL 的值。但是当另一个登录页面构造动态表单(它正
我有一个我一直致力于下载文件的程序。一切正常,除非用户使用 AVG。奇怪的是,为了解决这个问题,似乎必须禁用 AVG 的“电子邮件保护”;将我的程序或 JRE 添加到异常(exception)列表不起
我正在寻找一种方法来挂接 SMSManager 或较低级别的机制,以便我可以在发送任何外发 SMS 消息之前拦截、读取和取消它们。 最佳答案 迟到总比不到好:) 我已经在这上面花了 2 天...并且不
我已成功拦截对 read() 的调用, write() , open() , unlink() , rename() , creat()但不知何故截获完全相同的语义stat()没有发生。我已经使用 L
阿里云ECS通过安全组屏蔽/拦截/阻断特定IP对云服务器的访问 所适用的场景: 通过安全组屏蔽、拦截、阻止特定IP对用户云服务器的访问,或者屏蔽IP访问服务器的特定端口。 配置的方法: 1、
我希望能够在类本身的构造函数中代理类的所有方法。 class Boy { constructor() { // proxy logic, do something before
使用 ajax 请求可以使用以下代码完成: let oldXHROpen = window.XMLHttpRequest.prototype.open; window.lastXhr = ''; wi
我想“拦截”/更改将 OData 与 Web API 一起使用时生成的 OData 查询..但我不完全确定如何“提取”生成的查询..我假设 OData 过滤器、扩展和更多一些如何生成某种表达式树或某种
当 JUnit 中的断言失败时,我想做一些“自己的事情”。我想要这个: public class MyAssert extends org.junit.Assert { // @Overrid
如何拦截 PartialFunction?例如在 Actor 中,如果我只想打印进入以下接收方法的所有内容,然后再将其传递给流程方法: class MyActor extends Actor {
我们正在使用 fluentvalidation(带有服务堆栈)来验证我们的请求 DTO。我们最近扩展了我们的框架以接受“PATCH”请求,这意味着我们现在需要仅在补丁包含要验证的字段时才应用验证。 我
我有一个作为 excel 插件运行的 WPF 应用程序,它有这样的可视化树 精益求精 元素主机 WPF 用户控件 WPF 色带条控件 现在,在 excel 中加载插件时,不会启用位于 WPF 功能区栏
我是一名优秀的程序员,十分优秀!