SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: Diodo en Martes 12 de Diciembre de 2006, 15:16

Título: Apuntar A Null Al Destruir
Publicado por: Diodo en Martes 12 de Diciembre de 2006, 15:16
Hola

Como podria hacer para que al destruir un objeto su puntero se quede apuntando a NULL

El caso es este:

Código: Text
  1.  
  2. objeto *obj1=new objeto();
  3. delete obj1;  // Aqui el puntero se queda apuntado a algo que no es NULL
  4. if(obj1==NULL)printf("es null"); // y aqui no me caza los NULL
  5.  
  6.  

He probado en el destructor pero no se muy bien como hacerlo

Gracias y salu2
Título: Re: Apuntar A Null Al Destruir
Publicado por: JuanK en Martes 12 de Diciembre de 2006, 15:27
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->objeto *obj1=new objeto();
delete obj1;  
obj1 = NULL;
if(obj1==NULL)printf("es null"); <!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

O bien sobrecargar el operador delete (no se si C++ lo permita), o crear tu función
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
public static void Delete(object obj)
{
   delete obj;
   obj = NULL
}

...
objeto *obj1=new objeto();
Delete(obj1);
if(obj1==NULL)printf("es null");
...<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->
Título: Re: Apuntar A Null Al Destruir
Publicado por: Diodo en Martes 12 de Diciembre de 2006, 15:33
Si, lo que probe fue esto:

Código: Text
  1.  
  2. void SMRentorno::operator delete( void *p )
  3. {
  4.   free(p);
  5.   p=NULL;
  6. }
  7.  
  8.  

pero no me cambia el ptro a NULL
Título: Re: Apuntar A Null Al Destruir
Publicado por: Eternal Idol en Martes 12 de Diciembre de 2006, 15:42
Solo podria hacerlo si tuvieras un doble puntero (o una referencia que es el mismo), como tenes un puntero solo podes cambiar su contenido mas no su direccion ya que dentro de la funcion es una variable local (en pila).

Que yo sepa la unica forma valida de sobrecargar delete es esta:
void operator delete(void*);

Con lo cual no podes hacerlo asi ...

Una manera un poco pobre:
Código: Text
  1.  
  2. #define Borrar(x)&#092;
  3. delete x;&#092;
  4. x = 0;
  5.  
  6.  

Pero igual no se si tiene mucho sentido lo que queres hacer.
Título: Re: Apuntar A Null Al Destruir
Publicado por: JuanK en Martes 12 de Diciembre de 2006, 15:55
:lol:  ya me acostumbre a la semántica de C#  <_<

Bueno el problema viene siendo entonces de apuntadores no?

Seria algo asi:

Código: Text
  1. public static void Delete(void **obj)
  2. {
  3.   delete *obj;
  4.   *obj = NULL
  5. }
  6.  
  7. ...
  8. objeto *obj1=new objeto();
  9. Delete(&obj1);
  10. if(obj1==NULL)printf(&#34;es null&#34;);
  11. ...
  12.  

 :rolleyes:
Título: Re: Apuntar A Null Al Destruir
Publicado por: Eternal Idol en Martes 12 de Diciembre de 2006, 15:58
Cita de: "JuanK"
:lol:  ya me acostumbre a la semántica de C#  <_<
¿Alguna vez estuviste acostumbrado a la de C++? Segun tus propios mensajes nunca aprendiste POO con C++.

Igual sigo sin ver la logica de comparar el puntero con NULL despues del delete. ¿Para que?
Título: Re: Apuntar A Null Al Destruir
Publicado por: JuanK en Martes 12 de Diciembre de 2006, 16:05
Los punteros en C/C++ no son exclusivos de POO.
Título: Re: Apuntar A Null Al Destruir
Publicado por: Diodo en Martes 12 de Diciembre de 2006, 16:06
Lo quiero hacer para esto

Código: Text
  1.  
  2. SMRentorno *ent1=new SMRentorno(&#34;ent1&#34;); // un objeto
  3. SMRentorno *ent2=new SMRentorno(&#34;ent2&#34;); // otro
  4. delete ent2; // destruyo el ultimo
  5. SMRlista&#60;SMRentorno&#62; list; // lista enlazada
  6. list.Insertar(ent1); // inserto el primero
  7. list.Insertar(ent2); // inserto el segundo (se me cuela pq no se como ver si esta destruido)
  8. list.Vaciar(); // al vaciar la lista e ir destruyendo da un error de ejecucion al colarse un ptro a una zona vacia
  9.  
  10.  

list es una template que estoy haciendo para listas enlazadas. En el metodo insertar quiero evitar que se me cuelen punteros vacios o que apunten a un objeto ya destruido, por eso queria que apuntase a NULL al destruirlos
Título: Re: Apuntar A Null Al Destruir
Publicado por: JuanK en Martes 12 de Diciembre de 2006, 16:06
Cita de: "Eternal Idol"
Igual sigo sin ver la logica de comparar el puntero con NULL despues del delete. ¿Para que?
 :rolleyes:

para saber si ya esta o aun esta creada una instancia, supongo.
Título: Re: Apuntar A Null Al Destruir
Publicado por: Diodo en Martes 12 de Diciembre de 2006, 16:08
Este es el codigo de Insertar en la plantilla

Código: Text
  1.  
  2.   void Insertar(T *nodo)
  3.   {
  4.     if(nodo!=NULL)
  5.     {
  6.       lista *p1,*p2;
  7.       p1=list;
  8.       if(p1==NULL)
  9.       {
  10.         p1=new lista();
  11.         if(p1!=NULL)
  12.         {
  13.           p1-&#62;act=nodo;
  14.           p1-&#62;next=NULL;
  15.           list=p1;
  16.         }  
  17.       }
  18.       else
  19.       {
  20.         while(p1-&#62;next!=NULL)
  21.           p1=p1-&#62;next;
  22.         p2=new lista();
  23.         if(p2!=NULL)
  24.         {
  25.           p2-&#62;act=nodo;
  26.           p2-&#62;next=NULL;
  27.           p1-&#62;next=p2;
  28.         }
  29.       }
  30.     }
  31.     else
  32.     {
  33.       //PORHACER error nodo nulo
  34.       printf(&#34;esta introduciendo un nodo NULO&#34;);
  35.     }
  36.   };
  37.  
  38.  
Título: Re: Apuntar A Null Al Destruir
Publicado por: Eternal Idol en Martes 12 de Diciembre de 2006, 16:11
¿Ese codigo supongo que es de ejemplo no? No tiene logica agregarlo a la lista ... por ahora parece que trabajas todo bastante estatico con lo cual podes evitar facilmente este problema.

Cita de: "JuanK"
Los punteros en C/C++ no son exclusivos de POO.

La sobrecarga de operadores si ...

Cita de: "JuanK"
para saber si ya esta o aun esta creada una instancia, supongo.

Si el codigo es finalmente como el que muestra no ya que todo es predefinido.
Título: Re: Apuntar A Null Al Destruir
Publicado por: Diodo en Martes 12 de Diciembre de 2006, 16:15
Ya se que no tiene logica, pero el caso es que estoy haciendo una libreria, y quiero evitar los errores en tiempo de ejecucion y que se muestre un error de que esta haciendo mal el que este usando la libreria
Título: Re: Apuntar A Null Al Destruir
Publicado por: JuanK en Martes 12 de Diciembre de 2006, 16:17
Bueno Diodo, al parecer estas usando generics  :rolleyes:
por lo cual supongo que es muy probable que estes haciendo un componente que otros usaran, yo creo que si es necesario hacer la validacion que pides, ya que no sabes que datos enviaran al metodo, por otro lados esta claro que si alghuien inserta y no se ha creado la lista entonces la crearas....

1- Me parece más sano que arrojes una excepcion cuando te envien como parametro algo que apunte a NULL.

2- La lista deberias inicializarla en el constructor de la clase, la lista vacia de por si no ocupa nada de memoria, asi que no seria un alto costo tenerla inicializada siempre.
Título: Re: Apuntar A Null Al Destruir
Publicado por: Eternal Idol en Martes 12 de Diciembre de 2006, 16:21
Cita de: "Diodo"
Ya se que no tiene logica, pero el caso es que estoy haciendo una libreria, y quiero evitar los errores en tiempo de ejecucion y que se muestre un error de que esta haciendo mal el que este usando la libreria
Podes usar la macro que te pase pero justamente es inutil ya que si es una libreria no van a usar tu codigo sino que haran lo que quieran. Incluso podes comprobar que tenes acceso al puntero y ese puntero puede no ser ya mas valido ...

Si al final lo tuyo no es mas que una lista que devolvera un puntero que alguien posteriormente utilizara no es tu problema si insertan cualquier cosa y no podes evitarlo.

PD. Los generics son de otro lenguaje.
Título: Re: Apuntar A Null Al Destruir
Publicado por: Diodo en Martes 12 de Diciembre de 2006, 16:25
Citar
Bueno Diodo, al parecer estas usando generics 

Generics son las templates? en tal caso si, pero solo es una parte de la libreria que estoy haciendo, o mas bien adaptando. Se trata de una libreria para trabajar con entornos virtuales de robots

Citar
1- Me parece más sano que arrojes una excepcion cuando te envien como parametro algo que apunte a NULL.

Lo tendre en cuenta, aunque primero debo saber como capturar esos ptros a objetos que no existen o han sido destruidos

Citar
2- La lista deberias inicializarla en el constructor de la clase, la lista vacia de por si no ocupa nada de memoria, asi que no seria un alto costo tenerla inicializada siempre.

Si la tengo en el constructor de la clase, el codigo que puse era una simplificacion del problema
Título: Re: Apuntar A Null Al Destruir
Publicado por: JuanK en Martes 12 de Diciembre de 2006, 16:28
Bueno al menos Diodo si me entendió porque el conoce C++ y C#, por eso le hable así con más confianza

Los Generics son el equivalente a los Tempates de C++, bueno no del todo pues tienen considerables mejoras, pero básicamente son equivalentes.
Título: Re: Apuntar A Null Al Destruir
Publicado por: Eternal Idol en Martes 12 de Diciembre de 2006, 16:34
Claaaaaaaaaaroooooooooooooooooo yo no entendi ... por eso te dije que los generics son de otro lenguaje claaaaaroooooo.

Diodo te tengo otro escenario mas interesante:
new
addNode
delete
enumNodes

¿En ese caso tambien es error de tu libreria?
Título: Re: Apuntar A Null Al Destruir
Publicado por: Diodo en Martes 12 de Diciembre de 2006, 16:40
No seria error de la libreria, pero si se diera el caso de que alguien hiciera eso, no estaria de mas que el programa pudiera continuar, hasta donde fuera posible y siempre que no produjera mas errores, y se mostrara una advertencia

Soy novato en esto de crear una libreria , asi que es posible que me este pasando en el nivel de intervencionismo  :P  o quizas quiera hacer una libreria para dummies
Título: Re: Apuntar A Null Al Destruir
Publicado por: Eternal Idol en Martes 12 de Diciembre de 2006, 16:44
Cita de: "Diodo"
No seria error de la libreria, pero si se diera el caso de que alguien hiciera eso, no estaria de mas que el programa pudiera continuar, hasta donde fuera posible y siempre que no produjera mas errores, y se mostrara una advertencia

Soy novato en esto de crear una libreria , asi que es posible que me este pasando en el nivel de intervencionismo  :P  o quizas quiera hacer una libreria para dummies
Tu lista devolveria un puntero que el programa usaria o no, vaya uno a saber. El programa no es tu responsabilidad

¿Que tal si yo hiciera esto?

Código: Text
  1.  
  2. char jaja[] = &#34;hoooola&#34;;
  3. clase *z = (clase*)&jaja;
  4. addNode(z);
  5.  
  6.  

No podes controlar el codigo que se ejecuta ANTES/DESPUES que tu libreria, lo que podes hacer es controlar el que se ejecuta DENTRO de tu libreria. Si tu libreria trabaja con esos datos es una cosa diferente claro ... ahi mete manejadores de excepciones y listo.
Título: Re: Apuntar A Null Al Destruir
Publicado por: Diodo en Martes 12 de Diciembre de 2006, 16:59
Entendido, gracias por la ayuda.
Título: Re: Apuntar A Null Al Destruir
Publicado por: JuanK en Martes 12 de Diciembre de 2006, 17:26
Cita de: "Diodo"
No seria error de la libreria, pero si se diera el caso de que alguien hiciera eso, no estaria de mas que el programa pudiera continuar, hasta donde fuera posible y siempre que no produjera mas errores, y se mostrara una advertencia

Soy novato en esto de crear una libreria , asi que es posible que me este pasando en el nivel de intervencionismo  :P  o quizas quiera hacer una libreria para dummies
En mi opinión siempre que se hace un componente para uso de otra persona que no fue el que lo creo hay que asegurarse de controlar la mayor cantidad de situaciones posibles...

Un componente o libreria es un producto que pretende reducir (en la medida de lo posible) el esfuerzo para lograr una funcionalidad X y mejorar la productividad de los que hagan uso de el.

Si el producto no controla algo o falla en algunas situaciones imprevistas luego te van a decir: es que ese componente que hizo Diodo es muy inestable o esta mal hecho etc... o tarde 20 horas en encontrar un error porque el componente de Diodo no me informo que no le podía pasar nulos ... etc

Siempre se debe hacer un componente de tal modo que se evite en la medida de lo posible que el que lo vaya usar haga mal uso de el, de allí que es importantísimo que si alguien hace mal uso del componente este componente haga una retroalimentación al usuario explicando que fue lo que hizo mal o donde esta el origen del uso indebido, con esto facilita la labor de depuración de quien use el componente, es decir cumple con su funcionalidad de disminuir el esfuerzo.
Título: Re: Apuntar A Null Al Destruir
Publicado por: JuanK en Martes 12 de Diciembre de 2006, 17:34
Cita de: "Eternal Idol"
¿Que tal si yo hiciera esto?

Código: Text
  1.  
  2. char jaja[] = &#34;hoooola&#34;;
  3. clase *z = (clase*)&jaja;
  4. addNode(z);
  5.  
  6.  
 :scream:

Claro, eso se puede hacer si alguien quiere hacer un uso malintencionado o fuera de lo normal para lo cual se hizo la libreria, pero de todas formas, no por el hecho que se pueda entrar a la casa por la ventana se va a dejar la puerta sin seguro.

definitivamente cada vez me gusta mas C#  :wub:

en C# ese código no funcionaria pues el safe type evita ese tipo de cosas.

Incluso presumo que con c++ managed extensions tampoco pasaría nada que no se deseara.
Título: Re: Apuntar A Null Al Destruir
Publicado por: JuanK en Martes 12 de Diciembre de 2006, 18:12
Cita de: "Eternal Idol"
Ah y la verdad que ese codigo sea o no valido en otros lenguajes es totalmente redundante en este subforo.
No para mí ;)
Título: Re: Apuntar A Null Al Destruir
Publicado por: Eternal Idol en Martes 12 de Diciembre de 2006, 18:12
Cita de: "JuanK"
Claro, eso se puede hacer si alguien quiere hacer un uso malintencionado o fuera de lo normal para lo cual se hizo la libreria, pero de todas formas, no por el hecho que se pueda entrar a la casa por la ventana se va a dejar la puerta sin seguro.
Ese era un caso EXTREMO, mira el otro que es mucho mas probable que pase:
new
addNode
delete
enumNodes

Yo no hablo de no dar un mensaje mediante un codigo de retorno de error o incluso una excepcion si uno intenta agregar un elemento con valor 0 pero no tiene sentido pasarle un puntero nulo a una lista y es imposible prevenir el paso de un elemento erroneo. Es un error del programa y no de la libreria.

Y en el caso de una lista como ya dije antes no fallaria la libreria, componente o como lo quieras llamar sino el programa por hacer uso de un valor que el inserto en esa lista y que no es valido.

Ah y la verdad que ese codigo sea o no valido en otros lenguajes es totalmente redundante en este subforo.

Cita de: "Diodo"
Entendido, gracias por la ayuda.
De nadas.
Título: Re: Apuntar A Null Al Destruir
Publicado por: Eternal Idol en Martes 12 de Diciembre de 2006, 18:13
Cita de: "JuanK"
No para mí ;)
Este es el subforo de C/C++ pero viendo como permitis que hablen de cualquier otro lenguaje no me extraña que respondas esa idiotez. Es totalmente redundante que ese codigo no sea valido en Perl, en ADA o en lo que sea.
Título: Re: Apuntar A Null Al Destruir
Publicado por: JuanK en Martes 12 de Diciembre de 2006, 18:19
Cita de: "Eternal Idol"
Cita de: "JuanK"
No para mí ;)
Este es el subforo de C/C++ pero viendo como permitis que hablen de cualquier otro lenguaje no me extraña que respondas esa idiotez. Es totalmente redundante que ese codigo no sea valido en Perl, en ADA o en lo que sea.
Es redundante para ti que no sabes C#, pero para Mi y para Diodo (supongo) que si sabemos C# no es una idiotez... solo es una idiotez para tí porque tu no sabes del tema.

Por otro lado para mi como moderador del foro de C/C++ no es una idiotez meter temas de otros lenguajes aca, el foro es para debatir acerca de puntos de vista, opiniones, conocimientos etc no para sezgar y discriminiar los comentarios al gusto particular de alguien. Si algún thread es especifico de un lenguaje diferente de C++ si seria movido, de lo contrario no.
Título: Re: Apuntar A Null Al Destruir
Publicado por: Diodo en Martes 12 de Diciembre de 2006, 18:19
En cierta medida creo que es bueno el facilitar el uso de la libreria, y evitar que el usuario haga cosas para las que no esta diseñada.

Sigo investigando sobre el tema, parece el meollo del asunto son los:
Dangling Pointers (http://en.wikipedia.org/wiki/Dangling_pointer)
Título: Re: Apuntar A Null Al Destruir
Publicado por: Eternal Idol en Martes 12 de Diciembre de 2006, 18:28
Cita de: "JuanK"
Es redundante para ti que no sabes C#, pero para Mi y para Diodo (supongo) que si sabemos C# no es una idiotez... solo es una idiotez para tí porque tu no sabes del tema.

Por otro lado para mi como moderador del foro de C/C++ no es una idiotez meter temas de otros lenguajes aca, el foro es para debatir acerca de puntos de vista, opiniones, conocimientos etc no para sezgar y discriminiar los comentarios al gusto particular de alguien. Si algún thread es especifico de un lenguaje diferente de C++ si seria movido, de lo contrario no.
Es redundante por no pertencer a este subforo y al tema tratado como lo seria que yo me pusiera a decir que ese no es valido para assembly.

Lo es, te guste o no. Y el moderador del foro de C/C++ deberia saber C++ pero bueno, solo hay lo que hay.
Título: Re: Apuntar A Null Al Destruir
Publicado por: Eternal Idol en Martes 12 de Diciembre de 2006, 18:29
Cita de: "Diodo"
En cierta medida creo que es bueno el facilitar el uso de la libreria, y evitar que el usuario haga cosas para las que no esta diseñada.

Sigo investigando sobre el tema, parece el meollo del asunto son los:
Dangling Pointers (http://en.wikipedia.org/wiki/Dangling_pointer)
Mejor podrias investigar sobre Smart Pointers  B)
Título: Re: Apuntar A Null Al Destruir
Publicado por: Diodo en Martes 12 de Diciembre de 2006, 18:45
Citar
Mejor podrias investigar sobre Smart Pointers

Ok ya llegue a esa parte, pero prefiero empezar por saber a que se debe el problema y despues ver las posibles soluciones.
Aunque sean de las STL prefiero buscar antes otra posible solucion, que si no se "emborrona" el codigo

Citar
Lo es, te guste o no. Y el moderador del foro de C/C++ deberia saber C++ pero bueno, solo hay lo que hay.

Es verdad.Yo propongo este moderador:

(http://www.cse.psu.edu/~yuanxie/community/whoswho/bjarne-stroustrup.jpg)

Aunque no se si tendra mucho tiempo libre .....  :devil:
Título: Re: Apuntar A Null Al Destruir
Publicado por: Eternal Idol en Martes 12 de Diciembre de 2006, 18:50
Cita de: "Diodo"
Ok ya llegue a esa parte, pero prefiero empezar por saber a que se debe el problema y despues ver las posibles soluciones.

Memoria dinamica manejada por los programadores  :devil:

Cita de: "Diodo"
Es verdad.Yo propongo este moderador:
Aunque no se si tendra mucho tiempo libre .....  :devil:

No estaria mal, a ver si en vez de dar entrevistas "falsas" se da una vuelta por aca  :lol:
Título: Re: Apuntar A Null Al Destruir
Publicado por: SteelX en Martes 12 de Diciembre de 2006, 22:28
Que discusion tan buena. como todas las que se dan aki.

Estoy de Acuerdo con eternal. utiliza smart pointers. La libreria Boost provee los shared pointers
Título: Re: Apuntar A Null Al Destruir
Publicado por: JuanK en Martes 12 de Diciembre de 2006, 22:55
Cita de: "eternal idol"
Lo es, te guste o no. Y el moderador del foro de C/C++ deberia saber C++ pero bueno, solo hay lo que hay.

Bueno no soy del todo ignorante de C ni de C++ ( si de programacion de C++ para windows) pero ya lo deje atras por otras tecnologías y muchas cosas ya las he olvidado o les perdi la practica porque no las manejo habitualmente.

Seria lo más justo un moderador que si dominara muy bien la herramienta y si alguien reúne los requisitos para ser moderador no tengo problema en cederle el lugar y no estoy hablando solamente de conocimiento...

Atras ya quedaron las épocas en que usaba C/C++ y java ...ya de java ni idea... he olvidado muchas cosas y las que no ya son obsoletas... pero ahi tampoco ha aparecido nadie y eso que esta la discucion abierta.
Título: Re: Apuntar A Null Al Destruir
Publicado por: Eternal Idol en Martes 12 de Diciembre de 2006, 23:00
Cita de: "JuanK"
si de programacion de C++ para windows
Eso no existe.
Título: Re: Apuntar A Null Al Destruir
Publicado por: JuanK en Martes 12 de Diciembre de 2006, 23:07
me refiero a programar haciendo uso de la API de windows, si bien lo he hecho en varias ocaciones siempre me pareció una perdida de tiempo porque no me interesa y nunca le dedique demasiado a ese tema.-
Título: Re: Apuntar A Null Al Destruir
Publicado por: Eternal Idol en Martes 12 de Diciembre de 2006, 23:14
Cita de: "JuanK"
me refiero a programar haciendo uso de la API de windows, si bien lo he hecho en varias ocaciones siempre me pareció una perdida de tiempo porque no me interesa y nunca le dedique demasiado a ese tema.-
OK, pero esta orientada a C la API de Windows.