为什么 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?

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

...

==5003== 300 (60 direct, 240 indirect) bytes in 1 blocks definitely lost in loss record 11 of 13

==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== by 0x6028623: ???

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

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

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

==5003== 通过 0x4044D4:log_env (zookeeper.c:733)

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

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

==5003== by 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,一般是not a problem

内存在 getTSData 内分配,其名称暗示它正在使用 thread-local storage and whose implementation 表明它只为每个线程分配一次缓冲区,并正确注册函数 freeBuffer 以在线程结束。

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