• Miércoles 20 de Noviembre de 2024, 14:26

Autor Tema:  La variable local no se destruye?  (Leído 3573 veces)

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
La variable local no se destruye?
« en: Martes 19 de Octubre de 2010, 14:50 »
0
Hola, tengo este pequeño fragmento de código:

Código: C++
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void funcion(int* &p)
  5. {
  6.  int local = 3;
  7.  
  8.  p = &local;  
  9. }
  10.  
  11. int main()
  12. {
  13.  int numero;
  14.  int *n = &numero;
  15.  numero = 2;
  16.  
  17.  funcion(n);
  18.  
  19.  cout << *n << endl;
  20.  cout << numero << endl;
  21.  system("PAUSE");
  22.  
  23.  return 0;  
  24. }
  25.  


Como podéis ver, creo un puntero en el main que apunta a una variable número y lo paso por referencia a la función.

Una vez dentro de la función, creo una variable local y hago que apunte a esa variable local.

Una vez que salgo de la función, la variable local (en teoría) se debería destruir, pero cuando imprimo el contenido del puntero nuevamente en el main, me da el valor que tenía la variable local dentro de la función.

Por qué el puntero me da el valor de la variable local de la función si se supone que se ha destruido al salir de la función y ya no existe?

Gracias.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: La variable local no se destruye?
« Respuesta #1 en: Martes 19 de Octubre de 2010, 17:43 »
0
En todo momento la variable, al ser local, esta en la pila.

Código: C++
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void funcion(int* &p)
  5. {
  6.  int local = 3;
  7.  
  8.  p = &local;  
  9. }
  10.  
  11. void joder()
  12. {
  13. int chau[] =
  14. {
  15. 666, 666, 666, 666, 666
  16. };
  17.  
  18. }
  19.  
  20. int main()
  21. {
  22.  int numero;
  23.  int *n = &numero;
  24.  numero = 2;
  25.  
  26.  funcion(n);
  27.  joder();
  28.  
  29.  cout << *n << endl;
  30.  cout << numero << endl;
  31.  system("PAUSE");
  32.  
  33.  return 0;  
  34. }
  35.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: La variable local no se destruye?
« Respuesta #2 en: Martes 19 de Octubre de 2010, 18:09 »
0
Es que a mí siempre me han dicho que cuando una variable sale de su ámbito, se destruye y desaparece.

Entonces, esto no es el todo así? Si una variable sale de su ámbito, se queda en la pila y se le puede apuntar con un puntero hasta que la pila se vacíe por algún motivo?

Agradecería una breve explicación sobre esto para aclararme las ideas.

Gracias.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: La variable local no se destruye?
« Respuesta #3 en: Martes 19 de Octubre de 2010, 22:26 »
0
¿Sale 666 con el codigo que te deje en lugar de 3, no? Al salir de su ambito la variable no es mas accesible efectivamente desde el punto de vista del lenguaje (no podes referenciar a local fuera de funcion) y tambien eventualmente a efectos practicos, el codigo original funciona de casualidad debido a que es simplemente un ejemplo.

Una funcion al comenzar "reserva" memoria en la pila restandole al puntero de la pila (registro esp) para sus variable locales y al retornar lo que hace es dejar la pila apuntando a donde lo hacia antes de ser llamada (sumandole lo que antes le resto), pero no pone esa memoria usada a 0 o algo asi, esa memoria pasa a estar disponible para la proxima funcion que sea llamada.

La mejor forma de ver como funciona es depurandolo instruccion por instruccion (de ensamblador).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: La variable local no se destruye?
« Respuesta #4 en: Martes 19 de Octubre de 2010, 22:27 »
0
jaja, me imagine la memoria explotando al destruirse la variable :P

la cosa es que generalmente se le llama destruir una variable a que la memoria(registro o lo que sea) en la que esta guardada deja de estar reservada en el bloque en donde fue definida. Pero eso no implica que se pierdan los valores, mientras que no vuelvas a usar esa memoria (y le escribas algo) ese valor se va a mantener hasta que se apague la pc.

para que se entienda mejor te dejo un ejemplo:
compilalo y mira que es lo que pasa  :ph34r:
Código: C++
  1.  
  2. #include <stdio.h>
  3.  
  4. int* funcion1();
  5. void funcion2();
  6.  
  7. int main()
  8. {
  9.  
  10.   int* p;
  11.  
  12.   p = funcion1();
  13.  
  14.   printf("%dn", *p);
  15.  
  16.   funcion2();
  17.  
  18.   printf("%dn", *p);
  19.  
  20.   return 0;
  21. }
  22.  
  23. int* funcion1()
  24. {
  25.  int a = 7;
  26.  return &a;
  27. }
  28.  
  29. void funcion2()
  30. {
  31.  int a = 1234;
  32. }
  33.  
  34.  

Seguramente te tire un warning en return &a; de funcion1, y la verdad que es algo bastante feo :P pero a modo ilustrativo viene bien

Saludos

Edito:

Ni mire el ejemplo de eternal idol, pero segun lei en lo que escribio mientras yo posteaba tiene el mismo comportamiento que el codigo que deje  :brickwall:
The sweet smell of a great sorrow lies over the land.


player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: La variable local no se destruye?
« Respuesta #5 en: Martes 19 de Octubre de 2010, 22:55 »
0
Muchas gracias a los 2, ya entiendo lo que pasa. Ya veo que lo de mi ejemplo ha sido simple casualidad y eso me ha hecho hacerme un lío.

Saludos.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: La variable local no se destruye?
« Respuesta #6 en: Sábado 23 de Octubre de 2010, 11:19 »
0
De nadas  B)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

alb

  • Nuevo Miembro
  • *
  • Mensajes: 24
    • Ver Perfil
Re: La variable local no se destruye?
« Respuesta #7 en: Viernes 29 de Octubre de 2010, 14:10 »
0
C++ te da la garantia que à salir de la funcion el destructor de todas las variables locales son llamado. Con los tipos triviales (int, short, char, *, ...) no hay destructor pero el principio es igual.
Pero en cuanto de que pasà a la memoria reservada para esas variables es un comportamento indeterminado. Es decir que puede quedarse tal que en la funcion, cambiar de valor, o explotar ;)
La nocìon de pila (stack) o de heap no existe en la norma de C ni de C++. Es un detalle que releva del systema (processor + Operating System).

jarv

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: La variable local no se destruye?
« Respuesta #8 en: Miércoles 30 de Marzo de 2011, 16:41 »
0
alb... encontre muy interesante y clara tu explicacion, pero... sucede lo mismo con todos los lenguajes de programacion??? te lo pregunto porque, por ejemplo, en otros lenguajes existen instrucciones para "destruir" las variales... ejemplo... en Visual Basic o VBScript (el ultimo para programar en ASP) cuando declaras una variable del tipo objeto haces un Set variable = objeto y en rigor al dejar de utilizarla haces un Set Variable = nothing, en esta ultima instruccion "liberas" la memoria, por tanto cabe la pregunta, que pasa si no utilizas en Set variable = nothing??? la memoria queda ocupada, y por ende a la larga, podria implicar una disminucion en la cantidad de memoria disponible??? pensemos en una aplicacion web en la que hay 100 usuarios concurrentes...

bueno, desde ya, gracias por tus comentarios

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: La variable local no se destruye?
« Respuesta #9 en: Miércoles 30 de Marzo de 2011, 16:57 »
0
Cita de: "jarv"
pero... sucede lo mismo con todos los lenguajes de programacion???
No conozco ninguno en el que no se destruyan las variables locales al salir de su ámbito, básicamente porque se reservan en la pila y la pila se "vacía" al salir del ámbito local.

Cita de: "jarv"
ejemplo... en Visual Basic o VBScript (el ultimo para programar en ASP) cuando declaras una variable del tipo objeto haces un Set variable = objeto y en rigor al dejar de utilizarla haces un Set Variable = nothing
Visual Basic es un lenguaje básicamente horrible, dado que introduce malísimas prácticas de programación, entre ellas pensar que asignando a una variable a nothing la estás liberando. Esto no es así, y sí, en VB también las variables tienen vida local, es decir, no hace falta asignarles a nothing para que se liberen. De hecho existe un modificador (static) para mantenerlas, por tanto sin ese modificador se liberan. Como te digo esto es debido a que en x86 las variables locales se reservan en la pila.

Esto obviamente no aplica para memoria reservada explícitamente (mediante una llamada a malloc() por ejemplo) dentro de una función. Éstas deben ser liberadas manualmente.