我是否需要从ptsname()中释放结果?

时间:2017-04-10 23:47:56

标签: c memory-leaks malloc gnu pty

当我致电ptsname()时,我会回来char*

联机帮助页没有指定其链接,所有权或生命周期,但是valgrind显示它导致泄漏(使用--leak-check=full)。

==46958== 128 bytes in 1 blocks are definitely lost in loss record 41 of 65
==46958==    at 0x10010FEBB: malloc (in /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==46958==    by 0x1003F9682: ptsname (in /usr/lib/system/libsystem_c.dylib)
==46958==    by 0x10001BA5F: startJob(childproc*) (unix-base.cc:211)
==46958==    by 0x100019CAB: stepChild(childproc*, std::__1::function<bin::Job* (bin::Job*)>) (unix-base.cc:281)
==46958==    by 0x100018F2C: bin::runJobs(std::__1::function<bin::Job* (bin::Job*)>, int) (unix-base.cc:350)
==46958==    by 0x1000027FC: pmain() (bin.cc:65)
==46958==    by 0x100003787: main (bin.cc:90)

然而,在free()结果后,我得到了通常的非malloc错误:

bin(46690,0x7fff76531000) malloc: *** error for object 0x7fb35af00f90: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
./bootstrap.sh: line 41: 46690 Abort trap: 6           bin/bin

这只是这个平台上ptsname()内部实现的漏洞,还是应该(以某种方式)释放结果?

1 个答案:

答案 0 :(得分:1)

库分配了那个内存,文档说库可能会重用那个内存,所以你应该释放它。

  

成功时,ptsname()返回指向静态存储中字符串的指针,该字符串将被后续调用覆盖。不得释放此指针。失败时,返回NULL指针。
  <子> The man page

你应该忽略这个valgrind警告。你可以告诉valgrind为你忽略它。

  

<强> --ignore-fn=<name>
  在此选项指定的函数中发生的任何直接堆分配(即对mallocnew等的调用,或对--alloc-fn选项命名的函数的调用)都将是忽略。这主要用于测试目的。可以在命令行上多次指定此选项,以命名多个功能   <子> The man page