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

解决MQL5中WebRequest引发的内存泄漏与ERR_INVALID_ARRAY报错

MQL5 新闻爬取函数内存泄漏与数组错误修复

错误根因

  • ERR_INVALID_ARRAY错误:GET请求场景下传入了未初始化的动态数组post[]作为POST数据参数,MQL5运行时校验数组有效性不通过触发错误。
  • 内存泄漏与字符串泄漏:
    1. 动态数组post[]、result[]使用完成后未主动释放内存,多次调用函数会累积未释放的堆内存
    2. 定义了未使用的静态字符串变量str2,静态变量的内存不会随函数调用结束自动释放,长期运行就会产生字符串泄漏
    3. 冗余的文件读写操作额外占用了缓冲区内存未完全回收
    4. 字符串变量str未初始化就参与拼接操作,可能产生不可预期的内存占用

修复后代码

string ReadCBOE()
{
    string cookie=NULL,headers;
    char result[];     
    string str = "";
    int res;

    string google_url="http://ec.forexprostools.com/?columns=exc_currency,exc_importance&importance=1,2,3&calType=week&timeZone=15&lang=1";
    ResetLastError();
    int timeout=5000; 
    // GET请求无需传POST数据,直接用NULL代替post数组
    res=WebRequest("GET",google_url,cookie,NULL,timeout,NULL,0,result,headers);
    if(res==-1)
    {
        Print("WebRequest error, err.code  =",GetLastError());
        MessageBox("You must add the address 'http://ec.forexprostools.com/' in the list of allowed URL tab 'Advisors' "," Error ",MB_ICONINFORMATION);
    }
    else
    {
        // 直接把字符数组转字符串,省略冗余的文件读写操作
        str = CharArrayToString(result);
        // 如果需要留存本地文件可以保留以下代码,不需要可以删掉
        int filehandle=FileOpen("news-log.html",FILE_WRITE|FILE_BIN|FILE_ANSI);
        if(filehandle!=INVALID_HANDLE)
        {
            FileWriteArray(filehandle,result,0,ArraySize(result));
            FileClose(filehandle);
        }
        else 
        {
            PrintFormat("Failed to open %s file, Error code = %d","news-log.html",GetLastError());
        }
    }
    // 主动释放result数组内存
    if(ArrayIsDynamic(result)) ArrayFree(result);
    return(str);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:24:03