• Viernes 8 de Noviembre de 2024, 23:04

Autor Tema:  Apuntar A Null Al Destruir  (Leído 6999 veces)

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Apuntar A Null Al Destruir
« en: Martes 12 de Diciembre de 2006, 15:16 »
0
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

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Apuntar A Null Al Destruir
« Respuesta #1 en: Martes 12 de Diciembre de 2006, 15:27 »
0
<!--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-->
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Apuntar A Null Al Destruir
« Respuesta #2 en: Martes 12 de Diciembre de 2006, 15:33 »
0
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

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Apuntar A Null Al Destruir
« Respuesta #3 en: Martes 12 de Diciembre de 2006, 15:42 »
0
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.

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.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Apuntar A Null Al Destruir
« Respuesta #4 en: Martes 12 de Diciembre de 2006, 15:55 »
0
:lol:  ya me acostumbre a la semántica de C#  &lt;_&lt;

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:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Apuntar A Null Al Destruir
« Respuesta #5 en: Martes 12 de Diciembre de 2006, 15:58 »
0
Cita de: "JuanK"
:lol:  ya me acostumbre a la semántica de C#  &lt;_&lt;
¿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?

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.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Apuntar A Null Al Destruir
« Respuesta #6 en: Martes 12 de Diciembre de 2006, 16:05 »
0
Los punteros en C/C++ no son exclusivos de POO.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Apuntar A Null Al Destruir
« Respuesta #7 en: Martes 12 de Diciembre de 2006, 16:06 »
0
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

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Apuntar A Null Al Destruir
« Respuesta #8 en: Martes 12 de Diciembre de 2006, 16:06 »
0
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.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Apuntar A Null Al Destruir
« Respuesta #9 en: Martes 12 de Diciembre de 2006, 16:08 »
0
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.  

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Apuntar A Null Al Destruir
« Respuesta #10 en: Martes 12 de Diciembre de 2006, 16:11 »
0
¿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.

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.

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Apuntar A Null Al Destruir
« Respuesta #11 en: Martes 12 de Diciembre de 2006, 16:15 »
0
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

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Apuntar A Null Al Destruir
« Respuesta #12 en: Martes 12 de Diciembre de 2006, 16:17 »
0
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.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Apuntar A Null Al Destruir
« Respuesta #13 en: Martes 12 de Diciembre de 2006, 16:21 »
0
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.

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.

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Apuntar A Null Al Destruir
« Respuesta #14 en: Martes 12 de Diciembre de 2006, 16:25 »
0
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

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Apuntar A Null Al Destruir
« Respuesta #15 en: Martes 12 de Diciembre de 2006, 16:28 »
0
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.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Apuntar A Null Al Destruir
« Respuesta #16 en: Martes 12 de Diciembre de 2006, 16:34 »
0
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?

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.

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Apuntar A Null Al Destruir
« Respuesta #17 en: Martes 12 de Diciembre de 2006, 16:40 »
0
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

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Apuntar A Null Al Destruir
« Respuesta #18 en: Martes 12 de Diciembre de 2006, 16:44 »
0
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.

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.


JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Apuntar A Null Al Destruir
« Respuesta #20 en: Martes 12 de Diciembre de 2006, 17:26 »
0
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.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Apuntar A Null Al Destruir
« Respuesta #21 en: Martes 12 de Diciembre de 2006, 17:34 »
0
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.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Apuntar A Null Al Destruir
« Respuesta #22 en: Martes 12 de Diciembre de 2006, 18:12 »
0
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í ;)
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Apuntar A Null Al Destruir
« Respuesta #23 en: Martes 12 de Diciembre de 2006, 18:12 »
0
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.

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.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Apuntar A Null Al Destruir
« Respuesta #24 en: Martes 12 de Diciembre de 2006, 18:13 »
0
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.

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.