【问题标题】:valgrind reports getpwuid() leaks in c++ with Ubuntuvalgrind 使用 Ubuntu 报告 c++ 中的 getpwuid() 泄漏
【发布时间】:2012-10-06 20:17:18
【问题描述】:

我有以下 C++ 文件,pwd01.cpp:

#include <pwd.h>
#include <iostream>
int main() {        
    passwd* pwd = getpwuid(getuid());
}

我使用以下命令编译它:

g++ pwd01.cpp -Wall -o pwd01

在 Ubuntu 12.04.1 LTS / gcc 版本 4.6.3 上,valgrind 报告泄漏(见下文)。当我在 Mac OS 10.6.8 / gcc 版本 4.2.1 上使用相同的命令编译相同的代码时,valgrind 报告没有泄漏。

我知道我不需要释放 passwd* (should I free pointer returned by getpwuid() in Linux?);所以我错过了什么?

valgrind ./pwd01
==10618== Memcheck, a memory error detector
==10618== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==10618== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==10618== Command: ./pwd01
==10618== 
==10618== 
==10618== HEAP SUMMARY:
==10618==     in use at exit: 300 bytes in 11 blocks
==10618==   total heap usage: 68 allocs, 57 frees, 10,130 bytes allocated
==10618== 
==10618== LEAK SUMMARY:
==10618==    definitely lost: 60 bytes in 1 blocks
==10618==    indirectly lost: 240 bytes in 10 blocks
==10618==      possibly lost: 0 bytes in 0 blocks
==10618==    still reachable: 0 bytes in 0 blocks
==10618==         suppressed: 0 bytes in 0 blocks
==10618== Rerun with --leak-check=full to see details of leaked memory
==10618== 
==10618== For counts of detected and suppressed errors, rerun with: -v
==10618== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

【问题讨论】:

    标签: c++ memory-leaks valgrind ubuntu-12.04 getpwuid


    【解决方案1】:

    似乎不是“真正的”泄漏,即,如果多次调用,泄漏不会复合;可能它持有一个指向内存区域的静态指针,如果它是 NULL(第一次)它分配这 60 个字节,然后不释放它们。

    MacOS X 版本要么使用真正的静态区域,要么其valgrind 变得更好suppressors

    只需在循环中运行 getpwuid 几百次,以确保它确实只泄漏 60 个字节(而不是 1200 个字节),以确保。

    更新

    我终于追踪到 nssswitch.cgetXXent.c 内部的几个结构的泄漏,它们的大小和说服力不同。虽然代码似乎进行了比实际需要更多的分配,需要 malloc 锁,但这通常不应该是可感知的性能方面,我肯定打算事后猜测 glibc 的维护者

    【讨论】:

    • 谢谢。我可以确认在循环中运行它 1000 次不会加剧泄漏:泄漏摘要与以前相同(肯定丢失了 60 个字节);然后堆摘要显示:总堆使用量:1,067 分配,1,056 释放,577,562 字节分配
    【解决方案2】:

    可能不是getpwuid() 本身导致该(假)阳性。它可能是 C 库在启动时初始化的任何其他东西,但在进程终止时不会拆除(因为进程正在消失,以及属于它的所有映射内存,有些东西不会'真的不需要被破坏/未分配)。正如另一个答案所说,运行一些额外的测试,特别是当您在提供的简单示例之外构建更多代码时,并确保数字稳定,而不是直接归因于您自己的代码。除了提交错误报告(我假设您不是 C 库开发人员之一,无论如何),您无法直接处理库代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 2017-07-17
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多