You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何仅启停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引擎底层库的设计特性:

  1. Valgrind定义的*仍可访问(still reachable)*内存和真正的泄漏内存(definitely lost/indirectly lost/possibly lost)有本质区别:仍可访问的内存指针始终被持有,并没有丢失,只是程序退出前没有被主动释放。
  2. 这部分8KB左右的内存是MATLAB引擎动态链接库初始化时分配的全局静态缓存、配置类内存,engClose接口仅会释放当前MATLAB会话相关的资源,不会主动释放这部分全局内存,官方设计是由操作系统在程序退出时统一回收。
  3. 这部分内存不会随着程序运行、引擎多次开闭累加,不会导致程序运行时内存占用持续上涨。
解决方案

该问题不需要功能性修复,也无法通过修改业务代码强制MATLAB底层释放这部分内存,只能通过以下两种方式处理:

  • 直接忽略:该现象对程序运行没有任何负面影响,程序退出后所有内存都会被操作系统回收,不会产生资源残留。
  • 屏蔽Valgrind提示:如果需要做内存泄漏检测不想看到该类提示,可以用Valgrind的抑制规则过滤MATLAB库产生的相关提示,操作步骤如下:
    1. 运行Valgrind生成抑制规则原始日志:
    valgrind --leak-check=full --show-leak-kinds=all --gen-suppressions=all --log-file=matlab_supp.log ./TestMatlab
    
    1. 从生成的matlab_supp.log中提取所有和MATLAB相关库对应的抑制规则,保存为matlab.supp文件
    2. 后续运行Valgrind检测时添加参数加载抑制文件即可:
    valgrind --suppressions=./matlab.supp --leak-check=full ./你的程序名
    

内容的提问来源于stack exchange,提问作者Amit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:15:00