c++ - valgrind 报告 getpwuid() 在 Ubuntu 中的 c++ 泄漏

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

我有以下 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 报告没有泄漏。

我知道我不需要释放密码* ( 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)

最佳答案

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

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

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

更新

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

关于c++ - valgrind 报告 getpwuid() 在 Ubuntu 中的 c++ 泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12919653/

相关文章:

c++ - 如何构造字符数组

c++ - `volatile` 在线程之间同步变量

javascript - 内存泄漏-定期图像下载

c++ - gprof 与 cachegrind 配置文件

c++ - 我怎样才能故意用未初始化的数据初始化一个变量,以便 valgrind 将该变量视为未初始化的?

c++ - 指向成员函数的函数指针

c++ - MinGW 的内存检查库

java - 处理程序内存泄漏?

c - .Call mdsplib - METAR - 缓冲区溢出 - 这个 valgrind 输出是什么意思?

c++ - 如果我想在名称列表中搜索名称,请使用 QMap 或 Qlist 容器