对于getpwnam中的内存泄漏,是否有修复方法或解决方法
Is there a fix or a workaround for the memory leak in getpwnam?
getpwnam内存泄漏有修复方法或解决方法吗?
getpwnam()
不会发生内存泄漏。实际上,后续调用将覆盖其静态内部缓冲区。
相反,这类函数是不可重入的,因此是非线程安全的 也就是说,内存泄漏是由那些系统调用引起的,这些系统调用通过 在这些情况下,RAII习惯用法是可取的,以免忘记释放分配的内存——请参阅异常安全。 在这种观点下,一些危险的函数是malloc()
分配内存,并在返回的数据使用后让应用程序对free()
负责。std::tr1::shared_ptr<>
也是一种可行的方式:对于shared_ptr,必须向free()
提供一个自定义的deleter,即当shared_ptr超出范围时的原始指针。scandir()
、asprintf()
、vasprintf()
等。
使用getpwnam_r。
我认为没有解决办法。以上答案没有帮助,请参阅:
daniel@senap:~/dev/tryouts$ uname -a
Linux senap 3.2.0-24-generic #39-Ubuntu SMP Mon May 21 16:52:17 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
daniel@senap:~/dev/tryouts$ cat getpwnam-leak.c
#include <sys/types.h>
#include <pwd.h>
extern void __libc_freeres(void);
int main()
{
char buf[1024];
struct passwd pw, *result;
getpwnam_r("root", &pw, buf, sizeof(buf), &result);
__libc_freeres();
}
daniel@senap:~/dev/tryouts$ valgrind --leak-check=full ./getpwnam-leak
==6951== Memcheck, a memory error detector
==6951== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==6951== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==6951== Command: ./getpwnam-leak
==6951==
==6951==
==6951== HEAP SUMMARY:
==6951== in use at exit: 300 bytes in 11 blocks
==6951== total heap usage: 69 allocs, 58 frees, 9,234 bytes allocated
==6951==
==6951== 300 (60 direct, 240 indirect) bytes in 1 blocks are definitely lost in loss record 11 of 11
==6951== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6951== by 0x4F35D94: nss_parse_service_list (nsswitch.c:678)
==6951== by 0x4F36855: __nss_database_lookup (nsswitch.c:175)
==6951== by 0x55F32A4: ???
==6951== by 0x4EEF1AC: getpwnam_r@@GLIBC_2.2.5 (getXXbyYY_r.c:256)
==6951== by 0x400607: main (in /home/daniel/dev/tryouts/getpwnam-leak)
==6951==
==6951== LEAK SUMMARY:
==6951== definitely lost: 60 bytes in 1 blocks
==6951== indirectly lost: 240 bytes in 10 blocks
==6951== possibly lost: 0 bytes in 0 blocks
==6951== still reachable: 0 bytes in 0 blocks
==6951== suppressed: 0 bytes in 0 blocks
==6951==
==6951== For counts of detected and suppressed errors, rerun with: -v
==6951== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 2 from 2)
daniel@senap:~/dev/tryouts$
要修复此问题,只需执行以下操作:
sudo sed -i s/compat/files/g /etc/nsswitch.conf
这似乎是由于libnss_compat中的一个错误引起的。更多信息,请访问bugs.debian.org.
相关文章:
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 使用类在C++中存储和列出变量/方法是否是一种好的做法
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 矢量擦除方法是否需要类才能具有 = 运算符?
- 如何构造一个类型特征,可以判断一个类型的私有方法是否可以在另一个类型的构造函数中调用?
- std::is_invocable 用于测试任意方法是否存在的语法(不仅是运算符())
- 这种获取模板参数包中最后一个元素的方法是否有隐藏的开销?
- 使用范围解析运算符时,在构造函数中调用虚拟方法是否安全?
- c++ 中的抽象方法是否曾经调用过?
- 抽象类/接口中的空方法是否被认为是一种好的做法?
- 当元组给出参数时,如何检查方法是否存在?
- 如何测试基类中的方法是否已使用谷歌模拟调用和执行?
- 在方法中调用方法是否会导致开销
- 在移出向量上调用 size() 方法是否安全?
- 此工厂方法是否会导致争用条件?
- 这种方法是否对分支的预测产生了影响
- 检查启发式方法是否兼容
- 此方法是否不适合在 std::unordered_map 中使用 2D 坐标作为键
- const 类方法是否阻止在类外部分配变量?