Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 14 Octubre 2015, 10:19 am



Título: Duda sobre parametros de una función C++
Publicado por: Kaxperday en 14 Octubre 2015, 10:19 am
La pregunta es, ¿cual de las 2 debería de hacer?

¿En este caso sería indiferente verdad?, puesto que vector<victima> _victimas es fijo, cuando lo paso como parametro reserva memoria en el metodo, y si hago cambios fuera del método no afectan al argumento que he pasado ¿no?, distinto de si fuera un puntero.

Código
  1. lista_victimas::lista_victimas(vector<victima> _victimas)
  2. {
  3. victimas = _victimas;
  4. //copy(_victimas.begin(), _victimas.end(), back_inserter(victimas));
  5. }

Cuando acaba un método, sus parametros se borran de memoria ¿no?. En este caso, ¿que hago, igualar punteros contenidos o que?.

Código
  1. void funcion(lista_victimas *_lista)
  2. lista_victimas lista;
  3. //añado miembros.
  4. mvictimas->lock();
  5. _lista = new lista_victimas(lista.obtener_victimas());
  6. mvictimas->unlock();

Ese código , asignaría en _lista otro puntero en la heap, pero que ocurriría con el que ya había.

Si en cambio igualo _lista = &lista; al perderse &lista al salir de la funcion que ocurriría con _lista despues?.

Saludos, estoy algo liado.


Título: Re: Duda sobre parametros de una función C++
Publicado por: ivancea96 en 14 Octubre 2015, 16:15 pm
Ese código , asignaría en _lista otro puntero en la heap, pero que ocurriría con el que ya había.

Si en cambio igualo _lista = &lista; al perderse &lista al salir de la funcion que ocurriría con _lista despues?.

El que había, seguirá existiendo. Pero el que tu creas, si no lo liberas en esa misma función, se quedará sin liberar, ocupando memoria.

Si igualas _lista a &lista, nuevamente no estarás haciendo nada. Simplemente, _lista apuntará a lista.


Título: Re: Duda sobre parametros de una función C++
Publicado por: Kaxperday en 14 Octubre 2015, 18:01 pm
El que había, seguirá existiendo. Pero el que tu creas, si no lo liberas en esa misma función, se quedará sin liberar, ocupando memoria.

Claro pero al no haberlo declarado en la heap al salir de la función desaparecerá de memoria, ¿en ese caso apuntaría a null el que le paso de parámetro no?.

También, quería confirmar si cuando le pasas un parametro como una string a una función (toda aquella variable que no sea puntero), al pasarselo ¿es como si la hubieramos declarado en la función no?

Ejemplo:

Código
  1. void funcion(int c)

Código
  1. void funcion()
  2. int c

Es lo mismo no?, ambas memorias se eliminan al salir de la función no?.

Si en cambio es un puntero del que hemos reservado memoria ya se que no que sigue, pero como ya digo si es una variable que recibe de parametro, cuenta como una variable de la misma función no es así?.

Saludos y gracias.


Título: Re: Duda sobre parametros de una función C++
Publicado por: ivancea96 en 14 Octubre 2015, 20:50 pm
Son muchas preguntas, así que mejor una respuesta general xD

Todo lo que definas en un determinado ámbito (Ej. una función, un bucle, un par de llaves...), se destruirá al salir de ese ámbito, a excepción de variables globales y campos static. Los parámetros de una función están dentro del ámbito de la función.

Pasar un parámetro lo único que hace es copiarlo. Si pasas una clase, llamas al constructor de copia. La excepción es pasar parámetros por referencia de este modo:

Código
  1. void func(string &arg){}

Dicho esto, todo lo que se deduzca de aquí, pues así será xD

Citar
¿En ese caso apuntaría a null el que le paso de parámetro no?

El que le pasas de parámetro, es un puntero. En ningún momento, los cambios que le hagas al puntero, se verán fuera de la función. Solo se verán los cambios que le hagas al objeto apuntado, que no es el caso del ejemplo que pusiste.

Así que no, no apuntará a NULL. E incluso en otro tipo de planteamiento, aunque se destruya un objeto, los punteros que apunten a él seguirán apuntando a la misma dirección de memoria (sería de hecho absurdo que el programa buscase todos los punteros a ese objeto y los igualase a NULL)


Título: Re: Duda sobre parametros de una función C++
Publicado por: Kaxperday en 16 Octubre 2015, 09:52 am
Buenas socio, si es lo que pensaba que lo copiaba el problema es donde se guarda la variable que lo copia, porque si al salir del método pierde el valor y estoy igualando lo que tiene a un puntero, entonces cuando salga se debería de perder, es un poco para comprender como funciona el compilador mejor.

Creo que esto funcionará:

Código
  1. lista_victimas::lista_victimas(vector<victima> _victimas)
  2. {
  3. victimas = _victimas;
  4. //copy(_victimas.begin(), _victimas.end(), back_inserter(victimas));
  5. }

Saludos.


Título: Re: Duda sobre parametros de una función C++
Publicado por: ivancea96 en 16 Octubre 2015, 10:18 am
Sí. Pero ahí ya no hay punteros en ningún lugar. Solo copias.


Título: Re: Duda sobre parametros de una función C++
Publicado por: Kaxperday en 16 Octubre 2015, 11:14 am
Sí. Pero ahí ya no hay punteros en ningún lugar. Solo copias.

Claro pero esa copia se almacena en algun lugar, ocupa memoria, por eso digo que si igualo las direcciones de memoria como puse, al salir la copia se pierde, entonces el puntero que apunta a la dirección de memoria de la copia al salir de pierde su valor. ¿no? XD




Título: Re: Duda sobre parametros de una función C++
Publicado por: ivancea96 en 16 Octubre 2015, 13:42 pm
Claro pero esa copia se almacena en algun lugar, ocupa memoria, por eso digo que si igualo las direcciones de memoria como puse, al salir la copia se pierde, entonces el puntero que apunta a la dirección de memoria de la copia al salir de pierde su valor. ¿no? XD
Esa copia se almacena, desde luego. La direccion de memoria del parámetro que pusiste ahí es la dirección de la variable dentro de la función. Es una variable nueva, copiada de la que le pasaste por parámetro.

Lo que le hagas a esa variable, no afectará al resto de lprograma, como regla general.


Título: Re: Duda sobre parametros de una función C++
Publicado por: Kaxperday en 16 Octubre 2015, 13:45 pm
Claro lo que digo es cuando esa memoria que es la copia del parámetro se libera, pues si igualo su dirección de memoria a un puntero, cuando se libere el puntero no tendrá nada, pues no habrá nada en esa dirección de memoria.


Título: Re: Duda sobre parametros de una función C++
Publicado por: ivancea96 en 16 Octubre 2015, 15:06 pm
Claro lo que digo es cuando esa memoria que es la copia del parámetro se libera, pues si igualo su dirección de memoria a un puntero, cuando se libere el puntero no tendrá nada, pues no habrá nada en esa dirección de memoria.
Aja xD