oben ist ein Code, um die Umgebungsvariable zu bekommen, wird es Speicherleck verursachen, wenn ich nicht freien Speicher von getenv (char *) zurückgegeben habe? Wenn nein, dann bitte, warum?Soll ich char * von getenv() freigeben/löschen?
Antwort
Nein, sollten Sie nicht. Standard 7.20.4.5 sagt:
Die getenv Funktion gibt einen Zeiger auf einen String mit dem Element angepassten Liste zugeordnet. Die Zeichenfolge , auf die verwiesen wird, darf nicht durch das Programm geändert werden, aber möglicherweise durch ein nachfolgender Aufruf der getenv Funktion überschrieben werden.
Ich glaube, dass Löschung durch den Text in Fettschrift abgedeckt ist.
Sie sollten es nicht freigeben. Dies ist ein Ausschnitt aus der man-Seite:
Wie normalerweise implementiert, gibt getenv() einen Zeiger auf eine Zeichenfolge in der Umgebungsliste zurück. Der Aufrufer muss darauf achten, diese Zeichenfolge nicht zu zu ändern, da dies die Umgebung des Prozesses verändern würde.
Nicht anfassen!
Nein. Sie haben keine Kontrolle über den Speicher. In der Regel handelt es sich um einen Zeiger auf ein statisches Array, das mehrmals wiederverwendet wird. Aus diesem Grund sollten Sie kopieren, wenn Sie planen, es für die spätere Verwendung zu speichern (Sie sollten sicherstellen, dass diese Kopie ordnungsgemäß freigegeben wird).
Wenn die Dokumentation nicht explizit besagt, dass Sie einen Zeiger freigeben dürfen, sollten Sie dies nicht tun.
Ich bin mir im Allgemeinen nicht sicher, aber auf POSIX-Systemen ist es nicht sinnvoll, die Zeichenfolge zu speichern, es sei denn, Ihr Programm ändert die Umgebung. Der Zeiger gab Punkte direkt an die interne Kopie zurück, keinen temporären Puffer. –
@R, es die Dokumente [sagen] (http://www.opengroup.org/onlinepubs/009695399/functions/getenv.html) "Der Rückgabewert von getenv() kann auf statische Daten zeigen, die von nachfolgenden überschrieben werden können ruft nach getenv() [...] ". Es kann sich also ändern, auch wenn es keine Putenv-Aufrufe gibt. –
Diese Sprache wurde in Ausgabe 7 gelöscht, beansprucht jedoch weiterhin, dass die Funktion nicht Thread-sicher ist. Ich nehme an, die einzige streng sanktionierte thread-sichere Art, auf die Umgebung zuzugreifen, ist über 'extern char ** environ;' ... –
Sie sollten es nicht löschen. Getenv bekommt nur einen Wert von einem char * Array (char ** environ, wenn ich mich richtig erinnere), das jede Umgebungsvariable enthält. Sie zu löschen führt zu undefiniertem Verhalten.
Wahrscheinlich der beste Grund, warum der Standard nicht sagt, dass Sie können. Nur weil eine Funktion einen Zeiger zurückgibt, heißt das nicht, dass der Zeiger gültig ist, um an free
zu übergeben. Wenn die Dokumentation einer Funktion nicht explizit angibt, dass die Funktion Speicher wie "durch Aufruf von malloc
" zuordnet und einen Zeiger auf diesen Speicher zurückgibt, müssen Sie davon ausgehen, dass der Zeiger nicht gültig ist, um ihn an realloc
oder free
zu übergeben.
- 1. Löschen von char-Array zurückgegeben von getenv()
- 2. Const Char Verkettung und getenv()
- 3. C - scanf() und dann getenv()
- 4. Warum getenv hat() gibt eine nicht-const string
- 5. Umwandlung von char ** in char * oder char
- 6. getenv funktioniert nicht in EC2 Server
- 7. Welches Signal soll ich behandeln und wie?
- 8. Speicherfehler bei Verwendung von const char *?
- 9. Saving Char von lex zu Array von Char in C
- 10. Fehler: ungültige Konvertierung von 'char *' zu 'char'
- 11. ungültige Konvertierung von 'const char *' in 'char *'
- 12. Aufruf von unmanaged Funktion char char *
- 13. Soll ich ProGuard verwenden?
- 14. welche von == und =: = soll ich verwenden?
- 15. Soll ich Spry von Dreamweaver verwenden?
- 16. ich nur String-Wert soll von JSON.stringify
- 17. Soll ich einen von dynamischen Zeiger
- 18. Soll ich den Prototyp von String modifizieren?
- 19. Welche Version von openssl soll ich verwenden?
- 20. Was soll ich anstelle von as.real verwenden?
- 21. Soll ich den Umfang von @Transactional minimieren?
- 22. Was soll ich anstelle von `qt5_use_modules` verwenden?
- 23. Was soll ich anstelle von sscanf verwenden?
- 24. Welche Version von SignalR soll ich ausführen?
- 25. clearing newline char von gtk.Textbuffer
- 26. unsigned char-Array breiten char-Array/string
- 27. Soll ich removeTarget bevor ich
- 28. C# Wie entferne ich char von LinkedList von chars zu einer char-Variable?
- 29. Soll ich Hörer freigeben?
- 30. Soll ich FileUpload.PostedFile.InputStream absetzen?
Ja, in der Praxis, wenn ich char * tok = strtok() mit seinem ersten Parameter rufe, ist return von getenv(). Die strlen (tok) und puts (tok) wird nicht funktionieren ... Ein ziemlich verkabeltes Ergebnis, ich glaube es wurde verursacht, weil strtok() durch den Text fett dargestellt wird – ackratos
Etwas veraltet, aber die Linux Man Seiten sagen 'char * getenv()' und nicht 'const char * getenv()'. Ich entdeckte das, weil meine Maschine nicht glücklich darüber war, dass ich die Zeichenkette freigab. Sind die man-Seiten nicht ganz korrekt? Ich hatte immer den Eindruck, wenn eine Funktion einen 'char * zurückgibt. "Man sollte es befreien." – hetepeperfan
@hetepeperfan Es ist nicht nur die man-Seite. Der Funktionsprototyp für 'getenv' gibt tatsächlich' char * 'und nicht' const char * 'zurück. Vielleicht ist die Schnittstelle älter als die übliche Verwendung von' const' oder Vielleicht ist es nur ein Versehen, das zu lange nicht angesprochen wurde. Ich bin damit einverstanden, dass es irreführend ist. – jdolan