【问题标题】:Why does m_zh = zookeeper_init( m_zkUrl.c_str(), NULL, 10000, 0, NULL, 0 ) cause a memory leak?为什么 m_zh = zookeeper_init( m_zkUrl.c_str(), NULL, 10000, 0, NULL, 0 ) 会导致内存泄漏?
【发布时间】:2015-05-28 05:27:46
【问题描述】:

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

...

==5003== 1 个块中的 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== by 0x5923BFC:getpwuid_r@@GLIBC_2.2.5 (getXXbyYY_r.c:256)

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

==5003== by 0x5946BC4: getlogin (getlogin.c:35)

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

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

==5003== by 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

【问题讨论】:

  • 如果你使用 c_str() 方法,你的代码就是纯 C++;我会考虑删除 C 标签。
  • 因为我用的是zookeeper c客户端库..

标签: c++ c memory-leaks valgrind apache-zookeeper


【解决方案1】:

你确定是内存泄漏吗?

Valgrind 说是still reachable,一般是not a problem

内存是在getTSData内分配的,它的名字暗示它正在使用thread-local storage,而它的implementation表明它只为每个线程分配一次缓冲区,并正确注册函数freeBuffer来释放这个分配的内存当线程结束。

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

【讨论】:

  • 在我的课堂上,我注释了除了以下两个语句之外的所有语句:**m_zh = zookeeper_init(m_zkUrl.c_str(), NULL, 10000, 0, NULL, 0)** 和 zookeeper_close(m_zh)
  • @ChengchengPei - 您发布的 Valgrind 日志截图 (loss record 13 of 13) 可能不是内存泄漏(因为它是 still reachable)。正如我所解释的,zookeeper_init 的调用 calloc 可能不是内存泄漏。 Valgrind 说你有内存泄漏(definitely lost: 60 bytes in 1 blocksindirectly lost: 240 bytes in 10 blocks),但它可能在你代码的其他地方(在你的 ZKConnection 类之外)。
  • 对不起,我应该发布损失记录 11 0f 13。我已经编辑了我的问题。但是导致问题的功能是一样的。
  • @ChengchengPei - getlogin 没有特定于 ZooKeeper 的内容。见stackoverflow.com/q/22932458/25507
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多