首页 > 代码库 > x264内存泄露的解决办法

x264内存泄露的解决办法

也许我使用的x264库比较原始,但经过测试,x264的库存在内存泄露.面对内存泄露,如何在尽量少改动的前提下解决这个问题。
下面是我解决的思路:
由于x264相关的内存分配与释放都有封装一层函数,我们可以在从这两个函数入手。将分配的内存记录到一个链表中,释放时从链表中删除。程序执行完后,
如果链表中有记录,说明是内存泄露,清空链表即可。


所以具体操作如下:
1.增加一个链表;
2.修改x264_malloc函数,将分配的内存记录在链表中;
3.修改x264_free函数,从链表中释放节点;
4.最后统一释放没有释放的内存,清空链表。




具体修改如下:
/****************************************************************************
 * x264_malloc:
 ****************************************************************************/
void *x264_malloc( int i_size )
{
    uint8_t * buf;
    uint8_t * align_buf;


    //多分配15个字节,用于内存对齐
    buf = (uint8_t *) malloc( i_size + 15 + sizeof( MallocNode ) );


   if(buf == NULL)
{
    return NULL;
    }
    align_buf = buf + 15 +  sizeof( MallocNode );


    //对齐首地址
    align_buf -= (long) align_buf & 15;


    //首地址的前面为链表的节点
    LPMallocNode mn = (LPMallocNode) ( align_buf - sizeof( MallocNode) ) ;


    //记录分配的内存地址和分配的大小
    mn->p = buf;
    mn->iSize = i_size;


    //加入到列表中,最好加互斥量 ,可以保证线程安全
    list_add_tail(&mn->node,&g_mallocList);

    //返回使用内存的首地址
    return align_buf;
}


/****************************************************************************
 * x264_free:
 ****************************************************************************/
void x264_free( void *p )
{
   if(p)
    {
//找到链表节点
    LPMallocNode mn = (LPMallocNode)(p-sizeof(MallocNode));


//从链表中删除
list_del(&mn->node);


//释放节点
free(mn->p);
    }
}




void x264_initMalloc()
{
//初始化链表
INIT_LIST_HEAD(&g_mallocList);
}


void x264_freeAllMalloc()
{
LPMallocNode mn,n;


//最后统一释放没有释放的内存
list_for_each_entry_safe(mn,n,&g_mallocList,node,MallocNode)
{
list_del(&mn->node);


free(mn->p);
}
}