Estado de Variables de retorno

Iniciado por x64core, 17 Enero 2012, 08:30 AM

0 Miembros y 1 Visitante están viendo este tema.

x64core

Saludos a todos vengo con una duda, mirad este codigo:

int* a()
{
int x;
int* p;

x = 10;
p = &x;
return p;


}


int main()
{
int* y;
int z=20;

y = a();

y=&z;
// que pasa con el valor 10?
}


bien, ultimamente me estoy preocupando mucho sobre los recursos y como administran la memoria mis programas y tengo una duda que pasa
con la variable ( valor 10 ) despues de la asignarle un nuevo valor al puntero que la tenia? el compilador borra internamente? osea ese 10, ahora el compilador sabe que esta libre para asignar algo en ese espacio de memoria? o la variable queda perdida en ese espacio? y si es asi como se haria entonces en ese caso para evitar eso?
de ante mano gracias :)

Xandrete

Bueno, primero una cosa. Lo que pretendes hacer en a() no se hace así. Cuando declaras la variable x, su ámbito de visibilidad se limita a la función donde la declaras. Aun en el caso de que funcionara, no es la manera correcta de llevarlo a cabo.

Para hacer algo como lo que quieres hacer, se utiliza:

Código (cpp) [Seleccionar]
int* p = new int; // si estas en C++
int *p = malloc(sizeof(int)); /* Si estas en C*/

Por lo demás, ¿qué pasa con el valor 10? No pasa absolutamente nada. Se queda por ahí, en algún lugar de la memoria, solo y abandonado sin que nadie pueda acceder a él Y_Y. ¿No te da penita? No se puede liberar la memoria ocupada por el 10 hasta que finalice el programa.

En fin, cuando ya no necesites más la memoria reservada, haces:

Código (cpp) [Seleccionar]
delete p;
free(p);

Se puede implementar un recolector de basura automático, como en Python. Aquí hay un ejemplo.

x64core

bien! gracias entonces pero y?
declarar todas las variables como globales ? :P
digamos quiero retornar un puntero a char pero el valor lo obtengo dentro de la funcion...

Uknow

Cita de: RHL en 20 Enero 2012, 04:50 AM
bien! gracias entonces pero y?
declarar todas las variables como globales ? :P
digamos quiero retornar un puntero a char pero el valor lo obtengo dentro de la funcion...
se hace de la misma manera. debes devolver la direccion del puntero.

Cita de: Xandrete en 17 Enero 2012, 11:48 AM
Bueno, primero una cosa. Lo que pretendes hacer en a() no se hace así. Cuando declaras la variable x, su ámbito de visibilidad se limita a la función donde la declaras. Aun en el caso de que funcionara, no es la manera correcta de llevarlo a cabo.

Para hacer algo como lo que quieres hacer, se utiliza:

Código (cpp) [Seleccionar]
int* p = new int; // si estas en C++
int *p = malloc(sizeof(int)); /* Si estas en C*/

Por lo demás, ¿qué pasa con el valor 10? No pasa absolutamente nada. Se queda por ahí, en algún lugar de la memoria, solo y abandonado sin que nadie pueda acceder a él Y_Y. ¿No te da penita? No se puede liberar la memoria ocupada por el 10 hasta que finalice el programa.

En fin, cuando ya no necesites más la memoria reservada, haces:

Código (cpp) [Seleccionar]
delete p;
free(p);

Se puede implementar un recolector de basura automático, como en Python. Aquí hay un ejemplo.
en este caso, a mi me parece que utilizar memoria dinamica es irrelevante. No es necesario.

Saludos.

x64core

puesi, pero si devuelvo un puntero el puntero se estaria declarando dentro de la funcion, viene siendo lo mismo que yo puse

rir3760

En mi opinión con solo la información que dio Xandrete ya debería estar solucionado el tema, a menos que busques algo mas y (en buen plan) no estés explicando de forma clara y precisa el problema.

Recopilando y extendiendo un poco:

* Puedes devolver la dirección en memoria de una variable local pero su uso (vía indirección) no sera valido ya que esas variables tienen el tipo de almacenamiento automático: se crean al inicio del bloque y se destruyen al finalizar este.

* Como indicas para solucionar esto puedes utilizar una variable "global" ya que su tipo de almacenamiento es estático: a partir de su definición la variable se crea y solo se destruye al finalizar el programa.

* Una mejor opción es seguir la recomendación de Xandrete: dependiendo del lenguaje utilizar malloc+free o new+delete ya que el objeto apuntado (como en el caso de las variables "globales") tiene el tipo de almacenamiento estático.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language