首页 新闻 搜索 专区 学院

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

0
悬赏园豆:20 [已解决问题] 解决于 2018-04-28 15:38

 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。

 

            请了解的大神指教

头文件1991的主页 头文件1991 | 初学一级 | 园豆:178
提问于:2018-02-10 09:17
< >
分享
最佳答案
0

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

头文件1991 | 初学一级 |园豆:178 | 2018-04-28 15:37
其他回答(2)
0

需要最小的环境. 

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

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

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

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

收获园豆:10
喜欢兰花山丘 | 园豆:222 (菜鸟二级) | 2018-02-17 01:20

不好意思,代码有点长,我就简化了一下。

fmp = file->map(3600, numOfTraces * ( 240 + 4L * samples));

其他的变量都是需要从文件中读取的变量

支持(0) 反对(0) 头文件1991 | 园豆:178 (初学一级) | 2018-02-28 09:11
0

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

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

收获园豆:10
伙小 | 园豆:219 (菜鸟二级) | 2018-02-27 17:38

fmp = file->map(3600, numOfTraces * ( 240 + 4L * samples));

 

fmp是从作为参数传递过来的。

黏贴上拉的代码空格是指什么?

支持(0) 反对(0) 头文件1991 | 园豆:178 (初学一级) | 2018-02-28 09:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册