2010-11-21 11 views

risposta

32

No, non dovresti. Standard 7.20.4.5 dice:

La funzione getenv restituisce un puntatore ad una stringa associata al membro della lista abbinato . La stringa indicata non deve essere modificata da il programma, ma può essere sovrascritta da una chiamata successiva alla funzione getenv .

Credo che la cancellazione sia coperta dal testo in grassetto.

+0

Sì, in pratica, se chiamo char * tok = strtok() con il suo primo parametro be return di getenv(). Il strlen (tok) e puts (tok) non funzionerà ... Un risultato abbastanza cablato, penso che sia stato causato da strtok() è coperto dal testo in grassetto – ackratos

+1

Un po 'obsoleto, ma le pagine man di linux dicono 'char * getenv()' e non 'const char * getenv()'. Ho scoperto questo dato che la mia macchina non era contenta di liberare la stringa. Le pagine man non sono completamente corrette? Ero sempre sotto l'impressione quando una fuction restituisce un 'char * 'uno dovrebbe liberarlo.? – hetepeperfan

+0

@hetepeperfan Non è solo la pagina man. Il prototipo di funzione per' getenv' restituisce infatti 'char *' e non 'const char *'. Forse l'interfaccia precede l'uso comune di 'const', o forse è solo una svista che non è stata affrontata troppo a lungo, ma è stato fuorviante. – jdolan

7

Non dovresti liberarlo. Questo è uno snippet dalla pagina man:

Come in genere implementato, getenv() restituisce un puntatore a una stringa all'interno dell'elenco di ambienti. Il chiamante deve fare attenzione a non modificare questa stringa, poiché ciò cambierebbe l'ambiente del processo.

Non toccarlo!

7

No. Non si controlla la sua conservazione. In genere, è un puntatore a un array statico che viene riutilizzato più volte. Per questo motivo, è necessario copiare se si prevede di memorizzarlo per un utilizzo successivo (è necessario assicurarsi che questa copia venga liberata correttamente).

A meno che la documentazione non dica esplicitamente che è possibile liberare un puntatore, non si dovrebbe.

+0

Non sono sicuro in generale, ma sui sistemi POSIX non è possibile archiviare la stringa a meno che il programma non modifichi l'ambiente. Il puntatore ha restituito i punti direttamente alla copia interna, non un buffer temporaneo. –

+0

@R, it docs [say] (http://www.opengroup.org/onlinepubs/009695399/functions/getenv.html) "Il valore restituito da getenv() può puntare a dati statici che possono essere sovrascritti da successivi chiama a getenv() [...] ". Quindi può cambiare anche se non ci sono chiamate 'putenv'. –

+0

Quella lingua è stata eliminata nel numero 7, ma afferma comunque che la funzione non è thread-safe. Suppongo che l'unico modo sicuro per accedere all'ambiente tramite thread è 'extern char ** environ;' ... –

4

Non dovresti eliminarlo. Getenv ottiene semplicemente un valore da un array char * (char ** environ, se non ricordo male), che contiene ogni variabile d'ambiente. Cancellarli causa un comportamento indefinito.

2

Probabilmente il miglior motivo per cui lo standard non dice che è possibile. Solo perché una funzione restituisce un puntatore non significa che quel puntatore è valido per passare a free. A meno che la documentazione di una funzione non specifichi specificamente che la funzione alloca la memoria "come se chiamando malloc" e restituisca un puntatore a quella memoria, è necessario assumere che il puntatore non sia valido per passare a realloc o free.

Problemi correlati