views:

112

answers:

1

I write two pieces of c programs like following, during memcheck process using Valgrind, a lot of mem leak information is given.

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);
}

Now I hope to make sure where are the possible problems in my program? Here I may post some valgrind information to let you know about the actual error information.

==29105== by 0x804A906: main (me_search.c:1480)

==29105==

==29105==

==29105== HEAP SUMMARY:

==29105== in use at exit: 124,088 bytes in 18 blocks

==29105== total heap usage: 37 allocs, 21 frees, 749,276 bytes allocated

==29105==

==29105== 272 bytes in 1 blocks are still reachable in loss record 1 of 18

==29105== at 0x402425F: calloc (vg_replace_malloc.c:467)

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

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

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

==29105==

==29105== 352 bytes in 1 blocks are still reachable in loss record 2 of 18

==29105== at 0x4024F20: malloc (vg_replace_malloc.c:236)

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

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

==29105== by 0x804A660: main (me_search.c:1439)

==29105==

==29105== 584 bytes in 1 blocks are still reachable in loss record 3 of 18

==29105== at 0x402425F: calloc (vg_replace_malloc.c:467)

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

==29105== by 0x8048724: GetMemory (me_search.c:106)

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

==29105==

==29105== 584 bytes in 1 blocks are still reachable in loss record 4 of 18

==29105== at 0x402425F: calloc (vg_replace_malloc.c:467)

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

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

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

==29105==

==29105== 584 bytes in 1 blocks are still reachable in loss record 5 of 18

==29105== at 0x402425F: calloc (vg_replace_malloc.c:467)

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

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

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

==29105==

==29105== 584 bytes in 1 blocks are still reachable in loss record 6 of 18

==29105== at 0x402425F: calloc (vg_replace_malloc.c:467)

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

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

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

==29105==

==29105== 584 bytes in 1 blocks are definitely lost in loss record 7 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 0x804879B: GetMemory (me_search.c:110)

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

==29105==

==29105== 584 bytes in 1 blocks are definitely lost in loss record 8 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 0x80487C9: GetMemory (me_search.c:111)

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

==29105==

==29105== 1,168 bytes in 1 blocks are still reachable in loss record 9 of 18

==29105== at 0x402425F: calloc (vg_replace_malloc.c:467)

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

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

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

==29105==

==29105== 1,168 bytes in 1 blocks are still reachable in loss record 10 of 18

==29105== at 0x402425F: calloc (vg_replace_malloc.c:467)

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

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

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

==29105==

==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)

==29105==

==29105== 6,336 bytes in 1 blocks are definitely lost in loss record 12 of 18

==29105== at 0x4024F20: malloc (vg_replace_malloc.c:236)

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

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

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

+1  A: 

Start with the two records marked "definitely lost", becuase those are certainly memory leaks:

==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)

What this indicates is that the memory allocated by calloc() on line 1315 of me_search.c got leaked. This happened when get_mem2D() was called by line 1393 of me_search.c in get_mem3D(), which in turn was called by line 109 in GetMemory(), which was called by line 1456 in main().

Those line numbers should be enough to start working out why it got leaked.

caf