C++中重复调用memcpy函数,会导致内存不断增加是怎么回事?

2019-01-03 01:59发布

 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。

 

            请了解的大神指教

3条回答
仙女界的扛把子
2楼-- · 2019-01-03 02:20

memcpy不会增加内存,是fmp变量的原因,TraceClass 能够及时的释放掉,但是fmp所指向的内存,也需要释放,但是fmp每次都会增加,file->umap(fmp)是失败的,要使fmp指向原位置在释放,这样内存就不会飙升

查看更多
Anthone
3楼-- · 2019-01-03 02:27

需要最小的环境. 

例如 numOfTraces , samples , TRACENUMBERLINE 这些变量都不清楚.

包括 uchar * fmp. 还有冗余的 short tempshort;

有一点可以肯定的 问题一定不是 memcpy. 猜测在于某个函数联动造成的processEvents.

当然对于你这种泄漏问题很好查找, 在 new 的地方多放些日志, 跟踪一下

查看更多
甜甜的少女心
4楼-- · 2019-01-03 02:45

memcpy是拷贝内存内容,不会导致内存增长;fmp未看到初始指向

黏贴上拉的代码空格都没有啊,感觉问题好多

查看更多
登录 后发表回答