C/Visual C - ¿Podemos retornar un objeto creado localmente?

 
Vista:

¿Podemos retornar un objeto creado localmente?

Publicado por Lalo (11 intervenciones) el 27/01/2003 16:39:15
Se puede hacer:
A funcion()
{
A Resultado;
reurn A;
}
Creo que sí, y que al retornar el valor se llama al constructor copia ¿no?
Se puede hacer para que no se llame al contructor copia, he oido algo de retornar ua referncia o un puntero ¿Cómo se haría? ¿Como de utilizaría el metodo desde fuera? Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:¿Podemos retornar un objeto creado localmente?

Publicado por chuidiang (677 intervenciones) el 27/01/2003 17:16:31
Puedes hacer eso y efectivametne se llama al constructor copia. Si la clase no lo tiene explicitamente, se llama a uno por defecto que hace una copia de "memoria". Tienes que tener cuidado con eso si la clase internamente lleva punteros.

Para no hacer copia, puedes devolver un puntero, pero entonces no puede ser una variable local. La variable local se destruye al salir de la función y el puntero quedará apuntando a un sitio indeterminado.

Para hacerlo correctamente debes hacer
A *funcion()
{
A *Resulado=NULL;
...
Resultado = new A();
return Resultado;
}

Lo que pasa que así es el de fuera el que se tiene que ocupar de hacer un delete explicitamente de lo que le han devuelto.

/* LLamada a la funcion */
A *Resultado = funcion();
... /* se usa Resultado */
delete Resultado;

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Podemos retornar un objeto creado localmente?

Publicado por Lalo (11 intervenciones) el 27/01/2003 17:42:33
¿Cual es la mejor forma de hacerlo o por lo menos la más habitual? Y otra cosilla ¿Por qué dices que no puede ser una variable local si tu estás devolviendo un puntero a una variable local que se destruye al salir ¿no? (Resultado es una variable local y tu devuelves un puntero a Resultado)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Podemos retornar un objeto creado localmente?

Publicado por maCo (40 intervenciones) el 27/01/2003 22:27:23
1.- A Resultado
2.- A *Resultado

son diferentes declaraciones.
el primero se destruira al terminar la funcion, y por lo tanto al salir apuntara a memoria basura.
el segundo no se destruira y por lo tanto al salir apuntara al objeto creado.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Podemos retornar un objeto creado localmente?

Publicado por chuidiang (677 intervenciones) el 28/01/2003 05:50:32
Si devuelves un puntero a una variable local, al salir del método, la variable local se destruye, el puntero no. Sin embargo, el puntero apunta a la zona de memoria que ocupaba la variable local. Cuando el sistema decida reutilizar esa zona de memoria y la rellene con otra cosa que puede no tener nada que ver, el puntero estará accediendo a una zona de memoria con datos no válidos. Por ello no puedes devolver punteros a variables locales.

Lo más habitual es hacer return de variables simples o que ocupen poca memoria, en el que el tiempo de la copia es despreciable. Para variables más grandes se suelen retornar punteros.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Podemos retornar un objeto creado localmente?

Publicado por Lalo (11 intervenciones) el 28/01/2003 10:03:50
Perdona que insista. Veo que lo que dices funciona bien, pero lo que no entiendo es que digas que \"Por ello no puedes devolver punteros a variables locales\". Porque es lo que estás haciendo y no hay ningún problema. Quizá es que no te entiendo bien.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Podemos retornar un objeto creado localmente?

Publicado por chuidiang (677 intervenciones) el 28/01/2003 18:37:13
Cuando pones
funcion()
{
A *Resultado;
...
return Resultado;
}

estas devolviendo una variable local (que es un puntero), no un puntero a una variable local.

Si Resultado es una variable local (sea o no puntero), puedes poner return Resultado, pero no debes poner return &Resultado.

Si tienes
A *Resultado
Resultado = new A();
return Resultado

el puntero Resultado local se destruye, igual que cualquier otra variable local, pero el return se encarga de hacer una copia de ese puntero (return siempre hace una copia de lo que se le pone detrás). La memoria que has reservado con new no se destruye de ninguna manera hasta que hagas un delete.

Es un poco liado de explicar, pero espero que ya esté.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar