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

来源:互联网 发布:和英国女人 知乎 编辑:程序博客网 时间:2024/06/05 20:42

使用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赋值。



0 0