C++ getpwnam中的内存泄漏是否有修复或解决方法?

C++ getpwnam中的内存泄漏是否有修复或解决方法?,c++,linux,C++,Linux,getpwnam中的内存泄漏是否有修复或解决方法?使用getpwnam\u r。使用getpwnam\u r。getpwnam()不会发生内存泄漏。实际上,后续调用将覆盖其静态内部缓冲区 这种函数是不可重入的,因此是非线程安全的。Paul建议使用getpwnam_r(),这是可重入的版本,可以安全地在多线程上下文中使用 也就是说,内存泄漏是由系统调用引起的,这些调用通过malloc()分配内存,并让应用程序在返回的数据使用后负责free()内存 在这些情况下,为了不忘记释放分配的内存,建议使用R

getpwnam中的内存泄漏是否有修复或解决方法?

使用getpwnam\u r。

使用getpwnam\u r。

getpwnam()
不会发生内存泄漏。实际上,后续调用将覆盖其静态内部缓冲区

这种函数是不可重入的,因此是非线程安全的。Paul建议使用
getpwnam_r()
,这是可重入的版本,可以安全地在多线程上下文中使用

也就是说,内存泄漏是由系统调用引起的,这些调用通过
malloc()
分配内存,并让应用程序在返回的数据使用后负责
free()
内存

在这些情况下,为了不忘记释放分配的内存,建议使用RAII习惯用法——请参阅异常安全
std::tr1::shared\u ptr
也是一种可行的方法:对于shared\u ptr,当shared\u ptr超出范围时,必须为原始指针
free()
提供一个自定义删除器

在这种情况下,一些危险的函数是
scandir()
asprintf()
vasprintf()
等。

getpwnam()
不会发生内存泄漏。实际上,后续调用将覆盖其静态内部缓冲区

这种函数是不可重入的,因此是非线程安全的。Paul建议使用
getpwnam_r()
,这是可重入的版本,可以安全地在多线程上下文中使用

也就是说,内存泄漏是由系统调用引起的,这些调用通过
malloc()
分配内存,并让应用程序在返回的数据使用后负责
free()
内存

在这些情况下,为了不忘记释放分配的内存,建议使用RAII习惯用法——请参阅异常安全
std::tr1::shared\u ptr
也是一种可行的方法:对于shared\u ptr,当shared\u ptr超出范围时,必须为原始指针
free()
提供一个自定义删除器


从这个角度来看,一些危险的函数是
scandir()
asprintf()
vasprintf()
等等。

我认为没有解决办法。上述答案没有帮助,请参阅:

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$ 
daniel@senap:~/dev/tryouts$uname-a
Linux senap 3.2.0-24-generic#39 Ubuntu SMP周一5月21日16:52:17 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
daniel@senap:~/dev/tryouts$cat getpwnam leak.c
#包括
#包括
外部无效(无效);;
int main()
{
char-buf[1024];
结构passwd pw,*结果;
getpwnam_r(“根”和pw、buf、sizeof(buf)和result);
__libc_freeres();
}
daniel@senap:~/dev/tryouts$valgrind--leak check=full./getpwnam leak
==6951==Memcheck,内存错误检测器
==6951==2002-2011年版权(C)和GNU GPL'd,朱利安·苏厄德等人。
==6951==使用Valgrind-3.7.0和LibVEX;使用-h重新运行以获取版权信息
==6951==命令:./getpwnam泄漏
==6951== 
==6951== 
==6951==堆摘要:
==6951==在出口处使用:11个块中有300字节
==6951==总堆使用率:69个allocs,58个free,分配9234字节
==6951== 
==6951==1个块中的300(60个直接字节,240个间接字节)字节肯定会在11个块中的丢失记录11中丢失
==6951==at 0x4C2B6CD:malloc(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)
==6951==By0x4F35D94:nss解析服务列表(nsswitch.c:678)
==6951==0x4F36855:\u nss\u数据库\u查找(nsswitch.c:175)
==6951==0x55F32A4:???
==6951==by0x4eef1ac:getpwnam_r@@GLIBC_2.2.5(getXXbyYY_r.c:256)
==6951==0x400607:main(in/home/daniel/dev/tryouts/getpwnam泄漏)
==6951== 
==6951==泄漏汇总:
==6951==肯定丢失:1个块中有60个字节
==6951==间接丢失:10个块中有240字节
==6951==可能丢失:0个块中有0个字节
==6951==仍然可访问:0个块中有0个字节
==6951==抑制:0个块中有0个字节
==6951== 
==6951==对于检测到的和抑制的错误计数,请使用:-v重新运行
==6951==错误摘要:1个上下文中的1个错误(已抑制:2个上下文中的2个)
daniel@senap:~/dev/tryouts$

我认为没有解决办法。上述答案没有帮助,请参阅:

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$ 
daniel@senap:~/dev/tryouts$uname-a
Linux senap 3.2.0-24-generic#39 Ubuntu SMP周一5月21日16:52:17 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
daniel@senap:~/dev/tryouts$cat getpwnam leak.c
#包括
#包括
外部无效(无效);;
int main()
{
char-buf[1024];
结构passwd pw,*结果;
getpwnam_r(“根”和pw、buf、sizeof(buf)和result);
__libc_freeres();
}
daniel@senap:~/dev/tryouts$valgrind--leak check=full./getpwnam leak
==6951==Memcheck,内存错误检测器
==6951==2002-2011年版权(C)和GNU GPL'd,朱利安·苏厄德等人。
==6951==使用Valgrind-3.7.0和LibVEX;使用-h重新运行以获取版权信息
==6951==命令:./getpwnam泄漏
==6951== 
==6951== 
==6951==堆摘要:
==6951==在出口处使用:11个块中有300字节
==6951==总堆使用率:69个allocs,58个free,分配9234字节
==6951== 
==6951==1个块中的300(60个直接字节,240个间接字节)字节肯定会在11个块中的丢失记录11中丢失
==6951==at 0x4C2B6CD:malloc(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)
==6951==By0x4F35D94:nss解析服务列表(nsswitch.c:678)
==6951==0x4F36855:\u nss\u数据库\u查找(nsswitch.c:175)
==6951==0x55F32A4:???
==6951==by0x4eef1ac:getpwnam_r@@GLIBC_2.2.5(getXXbyYY_r.c:256)
==6951==0x400607:main(in/home/daniel/dev/tryouts/getpwnam泄漏)
==6951== 
==6951==泄漏汇总:
==6951==肯定丢失:1个块中有60个字节
==6951==间接丢失:10个块中有240字节
==6951==可能丢失:0个块中有0个字节
==6951==仍然可访问:0个块中有0个字节
==6951==抑制:0个块中有0个字节
==6951== 
==6951==对于检测到的和抑制的错误计数,请使用:-v重新运行