解决MQL5中WebRequest引发的内存泄漏与ERR_INVALID_ARRAY报错
MQL5 新闻爬取函数内存泄漏与数组错误修复
错误根因
- ERR_INVALID_ARRAY错误:GET请求场景下传入了未初始化的动态数组
post[]作为POST数据参数,MQL5运行时校验数组有效性不通过触发错误。 - 内存泄漏与字符串泄漏:
- 动态数组
post[]、result[]使用完成后未主动释放内存,多次调用函数会累积未释放的堆内存 - 定义了未使用的静态字符串变量
str2,静态变量的内存不会随函数调用结束自动释放,长期运行就会产生字符串泄漏 - 冗余的文件读写操作额外占用了缓冲区内存未完全回收
- 字符串变量
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
相关产品推荐
相关产品推荐

