当我打电话给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()
的内部实现的泄漏,还是我应该(以某种方式(释放结果?
该内存,文档说库可以重用该内存,因此不应释放它。
成功后,
ptsname()
返回一个指向静态存储中字符串的指针,该指针将被后续调用覆盖。不得释放此指针。失败时,将返回一个NULL
指针。
手册页
您应该忽略此瓦尔格林德警告。你可以告诉瓦尔格林德为你忽略它。
--ignore-fn=<name>
在此选项指定的函数中发生的任何直接堆分配(即对malloc
、new
等的调用,或对由--alloc-fn
选项命名的函数的调用(都将被忽略。这对于测试目的非常有用。可以在命令行上多次指定此选项,以命名多个函数。
手册页