解决mql5中的内存泄漏



我使用此代码从我抓取的网站获取信息获取新闻并在专家日志

上获取这两个错误消息
  1. 806912字节内存泄漏
  2. 1个泄漏字符串

当我运行get最后一个错误消息时,我得到ERR_INVALID_ARRAY

这里是我怀疑导致错误的函数,我怀疑它与这两个数组post[], result[]有关,虽然我不确定。任何形式的帮助都将不胜感激

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

static string str2 = "";

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; 
res=WebRequest("GET",google_url,cookie,NULL,timeout,post,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
{
int filehandle=FileOpen("news-log.html",FILE_WRITE|FILE_BIN|FILE_ANSI);
if(filehandle!=INVALID_HANDLE)
{
FileWriteArray(filehandle,result,0,ArraySize(result));
FileClose(filehandle);
//------+
int file_handle=FileOpen("news-log.html",FILE_READ|FILE_BIN|FILE_ANSI);
if(file_handle!=INVALID_HANDLE)
{
do
{
ResetLastError();
string Largestr=FileReadString(file_handle,4000);
if(GetLastError()!=0) break;
StringConcatenate(str,str,Largestr);
}
while(GetLastError()==0 && !FileIsEnding(file_handle));
FileClose(file_handle);
}
else PrintFormat("Failed to open %s file, Error code = %d","news-log.html",GetLastError());
}
}
return(str);
}

我知道现在帮助OP已经晚了,但是…

StringConcatenate多次被报道存在这种内存泄漏问题,特别是在循环中。而且,它比我在这种情况下使用的StringAdd慢。

也就是说,当数据已经在变量中时,我不理解为什么要写入日志文件并立即从中读取。在返回之前使用CharArrayToString可能会更容易/更快。

我怀疑您看到泄漏内存的原因是因为您没有正确处理错误。据我所知,c++中没有垃圾收集器,我认为MQL是垃圾收集器的一个子集。

因此,当抛出异常时,您仍然有未释放的已分配内存(即您的字符串)。当抛出错误时,尝试清除字符串(设置为null)。我认为这可能会消除错误泄漏问题。

最新更新