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
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.
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
Ese free nunca se va a ejecutar (por estar detrás del return).
Saludos
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
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.
Tubieras: Tuvieras tuberías.