valgrind报告使用Ubuntu在C 中泄漏
valgrind reports getpwuid() leaks in c++ with Ubuntu
我有以下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.c
和getXXent.c
内的几个结构。虽然代码似乎比真正必要的分配要多得多,需要malloc锁,但通常不应该在性能方面可观,而且我肯定会做 打算第二次猜测glibc !
可能不是 getpwuid()
本身会导致(false)正。C库在启动时可能会初始化C库,但随后不会在过程终止时拆除(因为该过程正在消失,以及所有属于它的映射的内存,有些事情都不确实需要破坏/未分配)。正如另一个答案所说,运行一些其他测试,尤其是当您构建更多的代码外,除了提供的简单示例之外,并确保数字稳定,并且不直接归因于您自己的代码。除了提交错误报告外,您对库代码无能为力(我假设您不是C库开发人员之一)。
- valgrind-hellgrind与泄漏检查的结果不同
- 在Ubuntu 16.04上安装Cilk时出现问题
- 如何在Ubuntu中使用cmake设置qt4
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 无法将 GLFW 库与 Ubuntu 18.04 上的头文件链接
- 尽管遵循了规则,内存泄漏在哪里
- 无法在Ubuntu上将共享库与Eclipse链接
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- Klocwork Inside的资源泄漏
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- valgrind报告使用Ubuntu在C 中泄漏