2010-06-07 55 views
-4

我使用Valgrind在memcheck进程期间编写了两段如下所示的c程序,给出了很多mem泄漏信息。可能的内存泄漏问题

int 
GetMemory(int framewidth, 
      int frameheight, 
      int SR/*, int blocksize*//*,int ALL_REF_NUM*/) 
{ 
    //int i,j; 
    int memory_size = 0; 
    //int refnum = ALL_REF_NUM; 
    int input_search_range = SR; 

    memory_size += get_mem2D(&curFrameY, frameheight, framewidth); 
    memory_size += get_mem2D(&curFrameU, frameheight>>1, framewidth>>1); 
    memory_size += get_mem2D(&curFrameV, frameheight>>1, framewidth>>1); 

    memory_size += get_mem3D(&prevFrameY, refnum, frameheight, framewidth);// to allocate reference frame buffer accoding to the reference frame number 
    memory_size += get_mem3D(&prevFrameU, refnum, frameheight>>1, framewidth>>1); 
    memory_size += get_mem3D(&prevFrameV, refnum, frameheight>>1, framewidth>>1); 

    memory_size += get_mem2D(&mpFrameY, frameheight, framewidth); 
    memory_size += get_mem2D(&mpFrameU, frameheight>>1, framewidth>>1); 
    memory_size += get_mem2D(&mpFrameV, frameheight>>1, framewidth>>1); 

    memory_size += get_mem2D(&searchwindow, input_search_range*2 + blocksize, input_search_range*2 + blocksize);// to allocate search window according to the searchrange 

    /*memory_size +=*/ get_mem1D(/*&SAD_cost, height, width*/); 
    // memory_size += get_mem2D(&searchwindow, 80, 80);// if searchrange is 32, then only 32+1+32+15 pixels is needed in each row and col, therefore the range of 
    // search window is enough to be set to 80 ! 

    memory_size += get_mem2Dint(&all_mv, height/blocksize, width/blocksize); 

    return 0; 

} 


void 
FreeMemory(int refno) 
{ 
    free_mem2D(curFrameY); 
    free_mem2D(curFrameU); 
    free_mem2D(curFrameV); 

    free_mem3D(prevFrameY,refno); 
    free_mem3D(prevFrameU,refno); 
    free_mem3D(prevFrameV,refno); 

    free_mem2D(mpFrameY); 
    free_mem2D(mpFrameU); 
    free_mem2D(mpFrameV); 

    free_mem2D(searchwindow); 
    free_mem1D(); 
    free_mem2Dint(all_mv); 
} 

void free_mem1D() 
{ 
    free(SAD_cost); 
} 

现在我希望,以确保地方都在我的计划中可能出现的问题? 在这里,我可能会发布一些valgrind信息,让你知道实际的错误信息。

== 29105 ==由0x804A906:主(me_search.c:1480)

== 29105 ==

== 29105 ==

== 29105 == HEAP内容:

== 29105 ==在使用中在出口处:在18个块

== 29105 ==总堆使用124088个字节:37个allocs,21周的FreeS,749276个字节分配

== 29105 ==

== 29105 ==在1块272个字节仍然在损失记录29105 ==在0x402425F 18 1的

==可达:释放calloc(vg_replace_malloc.c: 467)

== 29105 ==由0x804A296:get_mem2D(me_search.c:1315)

== 29105 ==由0x804885E:GetMemory(me_search.c:117)

== 29105 = = by 0x804A757:main(me_search.c:1 456)

== 29105 ==

== 29105 ==在1块352个字节仍然在损失记录2 18的

== 29105 ==在0x4024F20可达:malloc的(vg_replace_malloc。 C:236)

== 29105 ==由0x409537E:__fopen_internal(iofopen.c:76)

== 29105 ==由0x409544B:的fopen @@ GLIBC_2.1(iofopen.c:107)

== 29105 =通过= 0x804A660:主(me_search.c:1439)

== 29105 ==

== 29105 ==在1块584个字节仍然在损失记录3 18

可达== 29105 ==在0x402425F:释放calloc(vg_replace_malloc.c:467)

== 29105 ==由0x804A296:get_mem2D(me_search.c:1315)

== 29105 ==由0x8048724:GetMemory(me_search。 c:106)

== 29105 == by 0x804A757:main(me_search。C:1456)

== 29105 ==

== 29105 ==在1块584个字节仍然在损失记录4 18

==在0x402425F 29105 ==可达:释放calloc( vg_replace_malloc.c:467)

== 29105 ==由0x804A296:get_mem2D(me_search.c:1315)

== 29105 ==由0x8048747:GetMemory(me_search.c:107)

== 29105 ==由0x804A757:主(me_search.c:1456)

== 29105 ==

== 29105 ==在1块584个字节仍然在损失记录18 == 29105 5的

可达= =上0x402425F:释放calloc(vg_replace_malloc.c:467)

== 29105 ==由0x804A296:get_mem2D(me_search.c:1315)

== 29105 ==由0x8048809:GetMemory(me_search.c: 114)

== 29105 ==由0x804A757:主(me_search.c:1456)

== 29105 ==

== 29105 ==在1块584个字节仍然在损失记录18

6的可达

== 29105 ==在0x402425F:释放calloc(vg_replace_malloc.c:467)

== 29105 ==由0x804A296:get_mem2D(me_search.c:1315)

== 29105 ==通过0x804882C :GetMemory(me_search.c:115)

== 29105 ==由0x804A757:主(me_search.c:1456)

== 29105 ==

== 29105 ==在1块584个字节中记录损失18 7的肯定丢失

== 29105 ==在0x402425F:释放calloc(vg_replace_malloc.c:467)

== 29105 ==由0x804A296:get_mem2D(me_search.c:1315)

== 29105 ==由0x804A4F8:get_mem3D(me_search.c:1393)

== 29105 ==由0x804879B:GetMemory(me_search.c:110)

== 29105 ==由0x804A757:主(me_search.c:1456)

== 29105 ==

== 29105 ==在1块584个字节中记录损失8 18

==在0x402425F 29105 ==肯定丢失:释放calloc(vg_replace_malloc.c:467)

== 29105 ==由0x804A296:get_mem2D(me_search。C:1315)

== 29105 ==由0x804A4F8:get_mem3D(me_search.c:1393)

== 29105 ==由0x80487C9:GetMemory(me_search.c:111)

== 29105 ==通过0x804A757:主(me_search.c:1456)

== 29105 ==

== 29105 ==在1块1168个字节仍然在9的损失记录可达18

== 29105 ==在0x40242 5F:释放calloc(vg_replace_malloc.c:467)

== 29105 ==由0x804A296:get_mem2D(me_search.c:1315)

== 29105 ==由0x8048701:GetMemory(me_search.c:105)

== 29105 ==由0x804A757:主(me_search.c:1456)

== 29105 ==

== 29105 ==在1块1168个字节仍然在损失记录10可到达的的18

== 29105 ==在0x402425F:释放calloc(vg_replace_malloc.c:467)

== 29105 ==由0x804A296:get_mem2D(me_search.c:1315)

== 29105 ==由0x80487E6:GetMemory (me_search.c:113)

== 29105 ==由0x804A757:主(me_search.c:1456)

== 29105 ==

== 29105 ==在1块1168个字节肯定输了18场失利纪录11

== 29105 ==在0x402425F:释放calloc(vg_replace_malloc.c:467)

== 29105 ==由0x804A296:get_mem2D(me_search.c:1315)

== 29105 ==由0x804A4F8: get_mem3D(me_search.c:1393)

== 29105 ==由0x804876D:GetMemory(me_search.c:109)

== 29105 ==由0x804A757:主(me_search.c:1456)

== 29105 ==

== 29105 ==在1块6336个字节中记录损失18 12

==在0x4024F20 29105 ==肯定丢失:malloc的(vg_replace_malloc.c:236)

== 29105 ==通过0x804A25C:get_mem1D(me_search.c:1295)

== 29105 ==由0x8048866:GetMemory(me_search.c:119)

== 29105 ==由0x804A757:主(me_search。C:1456)

+1

是什么让你觉得有内存泄漏?你有什么试图找到它?你想达到什么目的?这个代码*应该做什么?请添加更多信息以帮助那些试图帮助您的人。 – DevinB 2010-06-07 09:14:55

+0

因为我发现我无法在linux环境下在我的Firefox浏览器中编辑帖子。因此,我首先通过该程序,然后转到另一台计算机编辑此帖。 对不起,造成的不便。 – MaiTiano 2010-06-07 09:18:12

+2

您是否验证过FreeMemory是否被卡住? – DevinB 2010-06-07 09:22:38

回答

2

开始与两个记录标记为“肯定丢失”,监守那些肯定内存泄漏:

==29105== 1,168 bytes in 1 blocks are definitely lost in loss record 11 of 18 
==29105== at 0x402425F: calloc (vg_replace_malloc.c:467) 
==29105== by 0x804A296: get_mem2D (me_search.c:1315) 
==29105== by 0x804A4F8: get_mem3D (me_search.c:1393) 
==29105== by 0x804876D: GetMemory (me_search.c:109) 
==29105== by 0x804A757: main (me_search.c:1456) 

什么这表明的是,通过calloc()me_search.c 1315行分配的内存泄漏了。 get_mem2D()me_search.c的01293行中的行调用,而get_mem3D()又被GetMemory()中的行109调用,该行由行1456中的main()调用。

那些行数应该足以开始工作为什么它被泄漏。