2017-04-10 2 views
0

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?

+1

'ptsnmame' ist nicht reentrent, da es einen statischen Speicher zurückgibt, sollten Sie die reentrent-Version' ptsname_r' verwenden. – fluter

Antwort

1

Die Bibliothek reserviert diesen Speicher, und die Dokumentation besagt, dass die Bibliothek diesen Speicher möglicherweise wiederverwenden kann. Sie sollten also nicht freigeben.

On success, ptsname() returns a pointer to a string in static storage which will be overwritten by subsequent calls. This pointer must not be freed. On failure, a NULL pointer is returned.
The man page

Sie sollten diese Valgrind-Warnung ignorieren. Du kannst Valgrind sagen, es für dich zu ignorieren.

Verwandte Themen