for(int i = 0 ; i < numOfTraces ; i++){
TraceClass *trace = new TraceClass();
qDebug() << trace;
printf("ii=%d,size =%d\n",i,sizeof(TraceClass));
trace->readTraceHead(fmp);
delete trace;
trace = NULL;
fmp += 240 + 4L * samples;
progress->setValue(i+1);
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
if(progress->wasCanceled()){
inLineHashMap.clear();
xLineHashMap.clear();
return false;
}
}
voidTraceClass::readTraceHead(uchar*fmp){
char*s;
longtemplong;
shorttempshort;
memcpy(&templong,fmp,4);
fmp+=4;
s=(char*)&templong;
TraceHead.TRACENUMBERLINE=BinToLong(s);//001-004
}
(1)如果把fmp +=240 + 4L * samples;注释掉,运行程序,内存不会变化很大;
(2)如果把memcpy这句话注释掉,内存不会飙升,如果不注释掉,内存上升很快达到G。
请了解的大神指教
memcpy不会增加内存,是fmp变量的原因,TraceClass 能够及时的释放掉,但是fmp所指向的内存,也需要释放,但是fmp每次都会增加,file->umap(fmp)是失败的,要使fmp指向原位置在释放,这样内存就不会飙升
需要最小的环境.
例如 numOfTraces , samples , TRACENUMBERLINE 这些变量都不清楚.
包括 uchar * fmp. 还有冗余的 short tempshort;
有一点可以肯定的 问题一定不是 memcpy. 猜测在于某个函数联动造成的processEvents.
当然对于你这种泄漏问题很好查找, 在 new 的地方多放些日志, 跟踪一下
不好意思,代码有点长,我就简化了一下。
fmp = file->map(3600, numOfTraces * ( 240 + 4L * samples));
其他的变量都是需要从文件中读取的变量
memcpy是拷贝内存内容,不会导致内存增长;fmp未看到初始指向
黏贴上拉的代码空格都没有啊,感觉问题好多
fmp = file->map(3600, numOfTraces * ( 240 + 4L * samples));
fmp是从作为参数传递过来的。
黏贴上拉的代码空格是指什么?