Wenn ich ptsname()
anrufen bekomme ich eine char*
zurück.Muss ich das Ergebnis von ptsname() freigeben?
Die Manpage gibt nicht ihre Verknüpfung, Besitz oder Lebensdauer an, aber Valgrind zeigt, dass es ein Leck verursacht (mit --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)
jedoch auf free()
-ing das Ergebnis, das ich die übliche un- malloc
bekommen ‚d Fehler:
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
Ist das nur ein Leck in der internen Implementierung von ptsname()
auf dieser Plattform oder sollten Ich (irgendwie) befreie das Ergebnis?
'ptsnmame' ist nicht reentrent, da es einen statischen Speicher zurückgibt, sollten Sie die reentrent-Version' ptsname_r' verwenden. – fluter