Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





pregunta respecto al free()

Iniciado por xeex, 16 de Junio de 2009, 12:00:09 PM

« anterior - próximo »

xeex

HOLA A TODOS

Estaba depurando un codigo y llegue a una instancia en donde tenia una funcion de este tipo:

float *rotar()
   {
             .
             .
             .
      float *valores;
      valores= (float *)malloc(3*sizeof (float));
      valores[0]=auxx1;
      valores[1]=auxy1;
      valores[2]=auxz1;
     
      return valores;   
   }
int main()
   {
              .
              .
              .
      float *valores_bmm;       
      valores_bmm=rotar();     
      float xgra,xchi,ygra,ychi,zgra,zchi;
      xchi=valores_bmm[0];   
      xgra=valores_bmm[1];     
      ychi=valores_bmm[2];   
      ygra=valores_bmm[3];     
      zchi=valores_bmm[4];   
      zgra=valores_bmm[5];     
      free(valores_bmm);//¿AQUI VA EL free()?¿y si lo va, está bien de esta manera?      .
              .
              .
              .
   }

Nunca habia devuelto a travez de un metodo o funcion(o como se le quiera llamar) un puntero.
Siempre que he reservado memoria, la he usado y liberado en la misma seccion de codigo en la que la cree, pero como ahora reservo memoria en una funcion y luego devuelvo esos valores a otra parte  no se donde y como poner el free().
Espero que se entienda que es lo que pregunto.
Yo creo que es como lo apunte en el codigo.

GRACIAS Y SALUDOS

Buffon

Se entiende perfectamente, pero antes lo hacías bien, ahora lo haces mal moralmente.

Nunca debes darle acceso a parte de la memoria virtual que tiene reservada una función a alguien que la esté llamando, viéndolo más criticamente, si tienes una librería con permisos administrador la cual te devuelve información contenida en su espacio de memoria la podrías liar parda.

No me gusta hablar de windows, pero para una cosa que hace bien, te explico como hace algunas cosas, desde mi trabajo en relación con la criptografía.

Cuando necesitas obtener por un buffer por ejemplo, el Issuer de un certificado, has de llamar a la función dos veces, la primera con el buffer a NULL y la variable de tamaño te devolverá cuanto espacio tienes que reservar, y la segunda después de haber hecho el malloc.

Para que se entienda.

byte *issuer = NULL;
int dwIssuer = 0;
ObtenIssuer(issuer,&dwIssuer);
issuer = malloc(sizeof(byte)*dwIssuer);
ObtenIssuer(issuer,&dwIssuer);

--

También hay que controlar errores y yo usaría calloc en vez de malloc.


---

Por otro lado, si lo quieres seguir haciendo así, el free debería ser responsabilidad del último en utilizar la estructura, pero ya te digo que con lógica está mal programado.

xeex

gracias por responder...
ahora me surge una duda, es esto valido:

float *rotar()
   {
             .
             .
             .
      float *valores;
      valores= (float *)malloc(3*sizeof (float));
      valores[0]=auxx1;
      valores[1]=auxy1;
      valores[2]=auxz1;
     
      return valores;   
      free(valores);
   }

un free de lo que se retorna( despues de retornarlo)??? se puede??? tiene sentido???
gracias y saludos

H-K

Ese free nunca se va a ejecutar (por estar detrás del return).

Saludos
"It's not who I am underneath, but what I do that defines me"

xeex

jjejeje  :o tienes toda la razon...es que en mi pais ya son las 6 AM y todavia no me duermo asi que estoy medio ZzzZZz....
gracias

Buffon

Además, si ponemos el caso que funcionara te encontrarías con una zona que el heap de memoria considera vacía, "mierda".

Con lo cuál, cualquier thread que tubieras y reservara memoria utilizaría esa posición, cambiando el valor del puntero a float que tienes.

Mars Attacks







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.