为何仅启停MATLAB C++ Engine API的程序有8132字节仍可访问内存,如何修复?
问题描述
为什么即使是仅执行引擎打开、关闭操作的简单程序,MATLAB C++版Engine API也会出现“99个内存块共8132字节仍可访问”的情况?
测试配置
本次使用的Valgrind测试命令如下:
valgrind --leak-check=full --show-leak-kinds=all --verbose --log-file=valgrind_output.txt ./TestMatlab
Valgrind日志输出片段:
==12340== ==12340== HEAP SUMMARY: ==12340== in use at exit: 8,132 bytes in 99 blocks ==12340== total heap usage: 3,810 allocs, 3,711 frees, 436,330 bytes allocated ==12340== ==12340== Searching for pointers to 99 not-freed blocks ==12340== Checked 3,940,672 bytes ... ... ... ==12340== LEAK SUMMARY: ==12340== definitely lost: 0 bytes in 0 blocks ==12340== indirectly lost: 0 bytes in 0 blocks ==12340== possibly lost: 0 bytes in 0 blocks ==12340== still reachable: 8,132 bytes in 99 blocks ==12340== suppressed: 0 bytes in 0 blocks ==12340== ==12340== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) ==12340== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
测试用C++代码:
#include "engine.h" #include <iostream> #include <stdlib.h> int main() { Engine *ep; if (!(ep = engOpen(""))) { std::cout <<"\nCan't start MATLAB engine" << std::endl; return EXIT_FAILURE; } std::cout << "Done!" << std::endl; engClose(ep); return 0; }
原因说明
这个现象不属于代码错误导致的内存泄漏,是MATLAB引擎底层库的设计特性:
- Valgrind定义的*仍可访问(still reachable)*内存和真正的泄漏内存(definitely lost/indirectly lost/possibly lost)有本质区别:仍可访问的内存指针始终被持有,并没有丢失,只是程序退出前没有被主动释放。
- 这部分8KB左右的内存是MATLAB引擎动态链接库初始化时分配的全局静态缓存、配置类内存,
engClose接口仅会释放当前MATLAB会话相关的资源,不会主动释放这部分全局内存,官方设计是由操作系统在程序退出时统一回收。 - 这部分内存不会随着程序运行、引擎多次开闭累加,不会导致程序运行时内存占用持续上涨。
解决方案
该问题不需要功能性修复,也无法通过修改业务代码强制MATLAB底层释放这部分内存,只能通过以下两种方式处理:
- 直接忽略:该现象对程序运行没有任何负面影响,程序退出后所有内存都会被操作系统回收,不会产生资源残留。
- 屏蔽Valgrind提示:如果需要做内存泄漏检测不想看到该类提示,可以用Valgrind的抑制规则过滤MATLAB库产生的相关提示,操作步骤如下:
- 运行Valgrind生成抑制规则原始日志:
valgrind --leak-check=full --show-leak-kinds=all --gen-suppressions=all --log-file=matlab_supp.log ./TestMatlab- 从生成的
matlab_supp.log中提取所有和MATLAB相关库对应的抑制规则,保存为matlab.supp文件 - 后续运行Valgrind检测时添加参数加载抑制文件即可:
valgrind --suppressions=./matlab.supp --leak-check=full ./你的程序名
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

