也许我使用的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);
}
}
下面是我解决的思路:
由于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);
}
}