Domanda

la mia funzione:

struct hostent * gethost(char * hostname){
    if(/*some condition under which I want 
         to change the mode of my program to not take a host*/){
       return null
    }
    else{
        struct hostent * host = gethostbyname(hostname);
        return host;
    }
}

nel principale:

struct hostent * host = gethost(argv[2]);

(ignorare eventuali piccoli errori nel codice, sto vomitando da memoria)

questo funziona bene. e Valgrind non mi dice che sto perdendo la memoria, nonostante il fatto non sto liberando.

Perché? Ho pensato roba allocato sullo stack scompare con la funzione di chiamata di ritorno? o è perché torno il puntatore? è questo pericoloso in qualche modo?

È stato utile?

Soluzione

host non è allocato nello stack, solo un puntatore ad essa è in pila. Il puntatore viene copiato quando la funzione restituisce, quindi non c'è niente di sbagliato con il codice.

Si noti che gethostbyname in realtà non allocare dinamicamente la memoria. Esso restituisce sempre un puntatore al blocco stesso allocato in modo statico della memoria, che è il motivo per valgrind non segnala una perdita. Attenzione, però, perché questo significa che è necessario copiare il hostent restituito dalla vostra funzione, se si desidera salvare il valore per più tardi a causa di ulteriori chiamate a gethost sovrascriverà esso.

Altri suggerimenti

E 'bene e non perdite perché il puntatore restituito non indica i dati sulla pila o heap, ma alcuni variabile statica.

http://linux.die.net/man/3/gethostbyname :

  

Le funzioni gethostbyname () e gethostbyaddr () può restituire puntatori ai dati statici, che possono essere sovrascritti da chiamate successive . Copia del hostent struct non è sufficiente, dal momento che contiene i puntatori; è richiesta una copia profonda.

dal manuale:

RETURN VALUE
       The gethostbyname() and gethostbyaddr() functions  return  the  hostent
       structure  or a NULL pointer if an error occurs.  On error, the h_errno
       variable holds an error number.  When non-NULL, the  return  value  may
       point at static data, ...

Alcuni memoria è riservata al momento della compilazione (es. All'interno del binario codice) per la struttura, la funzione restituisce un puntatore a questa memoria.

Beh, la memoria non è trapelato fino a quando tutti i riferimenti ad esso è perso, nel tuo esempio il puntatore viene restituito quindi c'è ancora un riferimento ad esso.

Comunque IMHO è una decisione di progettazione male sul maggior parte dei casi a fare affidamento su un'altra parte del codice per liberare memoria dinamica. Se la funzione deve restituire una struct per esempio, il chiamante deve farlo e passare un puntatore alla struttura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top