为什么 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
.
内
我实现了一个 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
.