Pregunta

mi función:

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;
    }
}

en el principal:

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

(ignorar los errores menores en el código, estoy vomitando de la memoria)

esto funciona bien. Valgrind y no me dice que estoy perdiendo la memoria, a pesar del hecho de que no estoy liberando.

¿Por qué? Pensé cosas incidencia a los pila desaparece con la llamada a la función de regresar? o es porque vuelvo el puntero? es este peligroso de alguna manera?

¿Fue útil?

Solución

host no se asigna en la pila, solamente un puntero a ella está en la pila. El puntero se copia cuando la función regresa, así que no hay nada malo con el código.

Tenga en cuenta que en realidad no gethostbyname asignar dinámicamente la memoria. Siempre devuelve un puntero al mismo bloque asignado de forma estática de la memoria, por lo que valgrind no informa de una fuga. Tenga cuidado, sin embargo, porque eso significa que tienes que copiar el hostent devuelto por la función si desea guardar el valor para más tarde porque pide además a gethost se sobreponen a él.

Otros consejos

Está bien y no fuga debido a que el puntero devuelto no apuntan a los datos en la pila o montón, pero alguna variable estática.

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

  

Las funciones gethostbyname () y gethostbyaddr () puede devolver punteros a los datos estáticos, que pueden ser sobrescritos por llamadas posteriores . Copiando la estructura hostent no es suficiente, ya que contiene punteros; Se requiere una copia profunda.

del manual:

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, ...

Algunos memoria se reserva en el tiempo de compilación (es decir. Dentro del binario del código) para la estructura, la función devuelve un puntero a esta memoria.

Bueno, la memoria no se pierde hasta que todas las referencias a ella se pierde, en su ejemplo se devuelve el puntero de modo que todavía hay una referencia a él.

Sin embargo en mi humilde opinión es una decisión de diseño mal en la mayoría de los casos que depender de otra parte del código para liberar la memoria dinámica. Si la función tiene que devolver una estructura, por ejemplo, la persona que llama debe hacerlo y pasar un puntero a la estructura.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top