valgrind报告使用Ubuntu在C 中泄漏

valgrind reports getpwuid() leaks in c++ with Ubuntu

本文关键字:泄漏 Ubuntu 报告 valgrind      更新时间:2023-10-16

我有以下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*(我应该在linux中返回getpwuid()吗?);那我想念什么?

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具有更好的抑制剂。

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

update

我终于将泄漏跟踪到不同尺寸和说服的nssswitch.cgetXXent.c内的几个结构。虽然代码似乎比真正必要的分配要多得多,需要malloc锁,但通常不应该在性能方面可观,而且我肯定会做 打算第二次猜测glibc

的维护者

可能不是 getpwuid()本身会导致(false)正。C库在启动时可能会初始化C库,但随后不会在过程终止时拆除(因为该过程正在消失,以及所有属于它的映射的内存,有些事情都不确实需要破坏/未分配)。正如另一个答案所说,运行一些其他测试,尤其是当您构建更多的代码外,除了提供的简单示例之外,并确保数字稳定,并且不直接归因于您自己的代码。除了提交错误报告外,您对库代码无能为力(我假设您不是C库开发人员之一)。