当我致电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()
内部实现的漏洞,还是应该(以某种方式)释放结果?
答案 0 :(得分:1)
库分配了那个内存,文档说库可能会重用那个内存,所以你应该不释放它。
成功时,
ptsname()
返回指向静态存储中字符串的指针,该字符串将被后续调用覆盖。不得释放此指针。失败时,返回NULL
指针。
<子> The man page 子>
你应该忽略这个valgrind警告。你可以告诉valgrind为你忽略它。
<强>
--ignore-fn=<name>
强>
在此选项指定的函数中发生的任何直接堆分配(即对malloc
,new
等的调用,或对--alloc-fn
选项命名的函数的调用)都将是忽略。这主要用于测试目的。可以在命令行上多次指定此选项,以命名多个功能 <子> The man page 子>