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