libevent使用点滴(1)使用libevent调用evthread_use_pthreads的一个可能的内存泄露

使用libevent时为了保证线程安全,提供了evthread_use_pthreads函数

他的内部是会分配内存的,但是没有对应的函数来反释放evthread_use_pthreads分配的内存,那么在如下的场景用evthread_use_pthreads就会造成内存泄露


libevent被编译为静态库然后被链接进了一个动态库A,我们在使用dlopen来加载静态库A,在使用时库A的内部是调用了evthread_use_pthreads的,会被分配内存出来,然后使用dlclose卸载掉库A,但是这里evthread_use_pthreads分配的内存并没有被释放掉!!!!然后又用dlopen来加载库A,这时其内部对evthread_use_pthreads的调用会不会分配新的内存,答案是会的,因为之前是整个把A卸载掉了。


如果不卸载掉A库,反复调用evthread_use_pthreads是不会造成泄露的,因为由全局变量在判别是否已经初始化了,但是卸载掉库后全局变量也就不存在了,再次加载全局变量依旧被初始化为0,evthread_use_pthreads会分配内存


当然,我们大多时候只会加载一次库


引用:

http://blog.chinaunix.net/uid-20361370-id-1962871.html

我来解释一下有可能导致的内存泄漏。

1、               加载了动态库liba.so,同时初始化了其数据段,这时mInstance应该为空。

2、               getInstance中,看到mInstance为空,则在堆中分配了一块内存,生成一个Myclass实例,同时为数据段的mInstance赋值。

3、               卸载了动态库liba.so,这时mInstance是不存在的,也就意味着我们丢失了在堆中生成的Myclass对象实例。

4、               加载了动态库liba.so,同时初始化了其数据段,这时mInstance应该为空。

5、               getInstance中,看到mInstance为空,则在堆中又分配了一块内存,生成一个Myclass实例,同时为数据段的mInstance赋值。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值