为什么m_zh=zookeeper_init(m_zkUrl.c_str(),NULL,10000,0,NULL,0)会

Why does m_zh = zookeeper_init( m_zkUrl.c_str(), NULL, 10000, 0, NULL, 0 ) cause a memory leak?

本文关键字:NULL str 10000 zkUrl zh zookeeper init 为什么      更新时间:2023-10-16

我实现了一个类来处理所有zookeeper的东西。在connect()中,我使用了m_zh=zookeeper_init(m_zkUrl.c_str(),NULL,10000,0,NULL,0)找一个动物园管理员。在类析构函数中,我使用了zookeeper_close(m_zh)释放这个动物园管理员。为什么还有内存泄漏?valgrind的输出如下。

===5003===300(60个直接字节,240个间接字节)在13个的丢失记录11中肯定丢失

===5003===在0x4C2CFA7:malloc(vg_replace_malloc.c:296)

===5003===通过0x596A594:nss_parse_service_list(nsswitch.c:678)

===5003===通过0x596B055:__nss_database_lookup(nsswitch.c:175)

===5003===通过0x6028623:???

===5003===通过0x5923BFC:getpwuid_r@@GLIBC_2.2.5(getXXbyYY_r.c:256)

===5003===通过0x5946E6E:__getlogin_r_loginuid(getlogin_r.c:68)

===5003===通过0x5946BC4:getlogin(getlogin.c:35)

===5003===通过0x4044D4:log_env(动物园管理员.c:733)

===5003===通过0x406026:zookeeper_init(zookeeper.c:770)

===5003===通过0x402FFC:ZKConnection::connect()(ZKConnection.cpp:37)

===5003===通过0x402962:main(test_zk.cpp:44)

==4624== LEAK SUMMARY:
==4624==    definitely lost: 60 bytes in 1 blocks
==4624==    indirectly lost: 240 bytes in 10 blocks
==4624==      possibly lost: 0 bytes in 0 blocks
==4624==    still reachable: 5,120 bytes in 2 blocks
==4624==         suppressed: 0 bytes in 0 blocks

您确定这是内存泄漏吗?

Valgrind说是still reachable,这通常不是问题。

内存是在getTSData中分配的,其名称表明它使用线程本地存储,其实现表明它每个线程只分配一次缓冲区,并正确注册函数freeBuffer以在线程结束时释放分配的内存。

您的代码确实存在内存泄漏(definitely lost: 60 bytes in 1 blocks),但我看不到任何迹象表明它在zookeeper_init中。