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

}

}

x264内存泄露的解决办法

时间: 2025-01-14 00:47:30

x264内存泄露的解决办法的相关文章

使用SDWebImage加载大量图片后造成内存泄露的解决办法 转载

使用SDWebImage加载大量图片后造成内存泄露的解决办法 时间:2015-07-21 14:26:47      阅读:5885      评论:0      收藏:0      [点我收藏+] SDWebImage的知名度就不用说了,github上近10k的star,国内外太多的App使用其进行图片加载. 但是最近在使用过程中发现,在UITableView中不断加载更多的内容,使用SDWebImage会造成内存占用越来越大,导致memory warning最终terminate,稍微找了下

WPF循环加载图片导致内存溢出的解决办法

程序场景:一系列的图片,从第一张到最后一张依次加载图片,形成"动画". 生成BitmapImage的方法有多种: 1. var source=new BitmapImage(new Uri("图片路径",UriKind.xxx)); 一般的场景使用这种方法还是比较方便快捷,但是对于本场景,内存恐怕得爆. 2. var data =File.ReadAllBytes("图片路径"); var ms = new System.IO.MemoryStr

Android开发常见的Activity中内存泄漏及解决办法

上一篇文章楼主提到由Context引发的内存泄漏,在这一篇文章里,我们来谈谈Android开发中常见的Activity内存泄漏及解决办法.本文将会以"为什么""怎么解决"的方式来介绍这几种内存泄漏. 在开篇之前,先来了解一下什么是内存泄漏. 什么是内存泄漏? 内存泄漏是当程序不再使用到的内存时,释放内存失败而产生了无用的内存消耗.内存泄漏并不是指物理上的内存消失,这里的内存泄漏是值由程序分配的内存但是由于程序逻辑错误而导致程序失去了对该内存的控制,使得内存浪费. 怎

.NET中常见的内存泄漏和解决办法

在.NET中,虽然CLR的GC垃圾回收器帮我们自动回收托管堆对象,释放内存,最大程度避免了"内存泄漏"(应用程序所占用的内存没有得到及时释放),但.NET应用程序"内存泄漏"的问题还是会存在,如果不加以注意,"内存泄漏"时有发生. 有关流以及Reader或Writer引起的内存泄漏 比如,把文件读取到流中: public static string ReadFile() { var filePath = @"硬盘地址"; va

闭包造成的内存泄露怎么解决?

1什么是内存泄露? 1. 定义:一块被分配的内存既不能使用,也不能回收.从而影响性能,甚至导致程序崩溃. 2. 起因:JavaScript的垃圾自动回收机制会按一定的策略找出那些不再继续使用的变量,释放其占有的内存.然而由于一些原因导致在这种机制下内存管理器不能正确解读JavaScript变量的生命周期,从而没有释放其内存,而也没有再被使用. 循环引用是导致以上情况的主要原因之一. 2 解决办法 常用的解决方法就是在JavaScript代码段运行完之时将形成循环引用的JavaScript对象手动

内存溢出(OOM)and内存泄露---及其解决

那么问题来了 什么是内存溢出out of memory?(OOM) 已有数据超出其分配内存所能存储的范围 比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. 什么是内存泄露memory leak? 指程序在申请内存后,无法释放已申请的内存空间, 他们到底啥关系? 一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光.memory leak会最终会导致out of memory! 哪些情况经常导致内存溢出??如何解决呢?? 当项目中包含大量图片

PF不明内存泄露已解决,白头发也没了(转)

在使用OpenExpressApp进行WPF应用开发过程中遇到多个内存泄漏的地方,在上一篇中求助了一个内存泄露问题[WPF不明内存泄露原因,头发都白了几根],本篇与大家分享一下如何解决此问题的过程. 问题发现 用户使用产品时,使用久了会报出内存溢出错误,于是开始查找内存泄露问题.在[WPF -.Net 4.0解决了DataGrid分组时的内存泄露]中介绍了一个DataGrid内存泄露问题,这里主要说的是关闭模块后对象仍没有释放的问题. 问题解决 这个问题在本周之前已经由另一同事使用ANTS Me

JS高程中的垃圾回收机制与常见内存泄露的解决方法

起因是因为想了解闭包的内存泄露机制,然后想起<js高级程序设计>中有关于垃圾回收机制的解析,之前没有很懂,过一年回头再看就懂了,写篇博客与大家分享一下. #内存的生命周期: 分配你所需要的内存: 由于字符串.对象等没有固定的大小,js程序在每次创建字符串.对象的时候,程序都会分配内存来存储那个实体. 使用分配到的内存做点什么. 不需要时将其释放回归: 在不需要字符串.对象的时候,需要释放其所占用的内存,否则将会消耗完系统中所有可用的内存,造成系统崩溃,这就是垃圾回收机制所存在的意义. 所谓的内

加入ehcache后,系统出现内存泄漏,解决办法

最近在系统中,加入缓存ehcache,但发现,每隔一天,服务器就会报出内存溢出.问题严重,后来在网上查资料发现,一篇解释的网文: spring中的提供了一个名为org.springframework.web.util.IntrospectorCleanupListener的监听器.它主要负责 处理由 JavaBeans Introspector的使用而引起的缓冲泄露.spring中对它的描述如下: 它是一个在web应用关闭的时候,清除JavaBeans Introspector的监听器.在web