Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: x64core en 17 Enero 2012, 08:30 am



Título: Estado de Variables de retorno
Publicado por: x64core en 17 Enero 2012, 08:30 am
Saludos a todos vengo con una duda, mirad este codigo:

Código:
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 :)


Título: Re: Estado de Variables de retorno
Publicado por: 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
  1. int* p = new int; // si estas en C++
Código
  1. 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
  1. delete p;
Código
  1. free(p);

Se puede implementar un recolector de basura automático, como en Python. Aquí (http://www.hpl.hp.com/personal/Hans_Boehm/gc/) hay un ejemplo.


Título: Re: Estado de Variables de retorno
Publicado por: x64core 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...


Título: Re: Estado de Variables de retorno
Publicado por: Uknow en 20 Enero 2012, 05:13 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.

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
  1. int* p = new int; // si estas en C++
Código
  1. 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
  1. delete p;
Código
  1. free(p);

Se puede implementar un recolector de basura automático, como en Python. Aquí (http://www.hpl.hp.com/personal/Hans_Boehm/gc/) hay un ejemplo.
en este caso, a mi me parece que utilizar memoria dinamica es irrelevante. No es necesario.

Saludos.


Título: Re: Estado de Variables de retorno
Publicado por: x64core en 20 Enero 2012, 06:59 am
puesi, pero si devuelvo un puntero el puntero se estaria declarando dentro de la funcion, viene siendo lo mismo que yo puse


Título: Re: Estado de Variables de retorno
Publicado por: rir3760 en 20 Enero 2012, 14:00 pm
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