Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





MFC y Punteros

Iniciado por 1cacalvo, 03 de Julio de 2006, 02:38:12 PM

« anterior - próximo »

1cacalvo

Bueno tengo un problema y no he conseguido solucionarlo...

En una clase A declaro un puntero a una clase de datos X, pero no le asigno memoria, simplemente la declaro como puntero... Desde la clase A llamo a un dialogo pasandole el puntero a la clase de datos. Hasta aqui todo bien, recogo el puntero, le asigno me memoria en la clase del dialogo...

El problema viene cuando salgo del dialogo, bien con el boton OK o con el boton cancelar (las unicas formas de salir del dialgo), y regreso a mi clase A, en ese momento pierdo la dirección del puntero y me apunta a NULL...

Y he revisado el codigo por si se me habia escapado algun delete o algun NULL y en principio todo esta correcto...

Una cosa que hago que igual viene por ahi el problema: En el constructor del dialogo recibo como parametro el puntero le asigno memoria y creo un puntero aux asignandole la dirección del puntero que recibo como parametro... Asi trabajo con esta variable auxiliar... Pero igual esta variable al cerrarse la ventana es destruida asi que perdiria la dirección en cuestión... NO SE TENDRE KE SEGUIR INVESTIGANDO :s

Si se les ocurre alguna cosilla de porque me pierde la referencia estaria muy agradecido

Un saludo

Warchief

Estás pasando un puntero o una referencia a puntero?


Create( X* )
vs
Create( X* & )


En el primer caso se pierde al salir de la función, porque estás modificando un parámetro local a la función. En el segundo caso funciona porque la referencia modifica el valor de fuera.

1cacalvo

Estoy pasando simplemente un puntero...
Pero declaro la variable como publica en mi clase principal, que no se destruye hasta finalizar el programa... Desde esa clase principal llamo a los distintos dialgos a los cuales tengo que pasar el puntero.

Voy a probar pasando como referencia a puntero a ver ke pasa :P

1cacalvo

Exactamente pasandole como referencia a puntero me conserva la dirección...

Aún asi no entiendo 100% porque como solo puntero se me borra si la instancia a la clase que contiene la variable nunca llega a destruirse...

               Muchas gracias...

Warchief

Prueba: Como verás, el printf muestra 5 en vez de 100. Eso es lo que te está pasando, pero con un puntero.

void Cambia( int x ) { x = 100; }

int main() {
 int a = 5;
 Cambia( a );
 printf("%d", a );
 
 return 1;
}


Extensamente (diferencia entre parámetros por valor y por referencia):
http://c.conclase.net/curso/index.php?cap=015

fiero

Como te ha dicho Warchief, debes pasar a la función la dirección donde almacenar el puntero, o sea, un puntero doble, o una referencia a un puntero (que es lo mismo). Las palabras en negrita son la clave, tú antes pasabas un puntero y lo que debes pasar en dónde almacenar el puntero.

Otro concepto importante, al salir de la función no se destruye la clase, las clases creadas mediante punteros nunca se destruyen automáticamente. Lo que ocurre es que almacenas el puntero a la nueva clase en una variable local de la función (tu parámetro puntero), no en la variable donde tú crees que se está almacenando. Puedes comprobar esto, corre el programa paso a paso y comprobarás que tu puntero en la clase principal no se modifica después de llamar a Crear(...).

vaya lio! :)

un saludo

EDIT: Hemos posteado al mismo tiempo Warchief :)
www.videopanoramas.com Videopanoramas 3D player

1cacalvo

Bueno ya creo que he asimilado el pequeño jaleo de direcciones de indirecciones...

Ahora esperemos que la prox vez no me vuelva a liar :D

                        Muchas gracias :P






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.