Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Hoy me desayuno con mucho dolor que ...

Iniciado por Pogacha, 08 de Mayo de 2009, 04:58:15 AM

« anterior - próximo »

Pogacha

... es redundante controlar un puntero antes de destruirlo!!!!!!!!
Toda la vida hice con la mayor de las convicciones:if(p) { delete p; p = 0; }
Sabia que delete (void*)0;  no tenia efecto, pero suponía que igual se llamaba al destructor .... pero resulta que no !!!!
El código generado por "delete p;" es similar a:if(p)
{
   p->~p();
   free( (void*) p );
}
con el if(p) incluido ... y al parecer ningún compilador poco copiosos del estandart (incluidos el nefasto VC6) hace algo distinto a esto. A no ser que alguno de ustedes tenga alguna información que quiera compartir y cambie este parecer (ya se de que el VC6 no tira un bad_alloc con el new pero no es este caso).

Lo comento aquí en el foro por las dudas otros también hallan sido engañados con esta practica, supongo que venia de C, if(p!=NULL)  free(p); donde si es necesario. Digo engañados por que yo lo tome como práctica de ver código ajeno, incluso el SDK de DX tiene un macro#define SAFE_DELETE(p)  if(p!=NULL) { delete p; p=NULL; } :O

Pues nada, por mas que me parecía conocer abundantemente bien el lenguaje al parecer me faltaba algo basico como esto.

Lo que si una vez me tope con un extraño error en Mac OS X por una función que devolvía NIL en un mal caso, el cual era un macro cual podía ser distinto de 0 (valor que yo supuse debia valer el cual me costo mucho trabajo encontrar)  ... en definitiva NULL = 0 y delete (el tipo que sea)NULL no tiene ningun efecto mas que una comparacion, otros macros tener mucho ojo.

Edit: agregue el parametro perdido en el SAFE_DELETE

Warchief

En efecto, en C++ delete 0 no es error (definido en el estándar). Cómo lo implementa cada compilador es otra cuestión.

Tal vez te interese esto:
http://www.research.att.com/~bs/bs_faq2.html#delete-zero

La implementación del safe_delete para c++ se hace con referencia a puntero, para que si se hace doble delete no falle.


template<class T> inline void safe_delete(T*& p) { delete p; p = 0; }

Buffon

#2

#define SAFE_DELETE(a)  if(a!=NULL) { delete a; a=NULL; }


Edito. La de arriba esta mucho mejor :P

:P

Tei

Cita de: Buffon en 08 de Mayo de 2009, 09:18:04 AM

#define SAFE_DELETE(a)  if(a!=NULL) { delete a; a=NULL; }


Edito. La de arriba esta mucho mejor :P

:P

igual es mejor rodear el valor de la macro en parentesis, aunque en este caso no creo que llegase nuna a pasar nada, mejor no hacer excepciones...


#define SAFE_DELETE(a)  if( (a) !=NULL) { delete (a); (a)=NULL; }


no se si estara mal,  y lo de (a)= parece que si compila.


Pogacha

#4
No se si se esta entendiendo

SAFE_DELETE es una redundancia = algo malo

tan solo has  delete p; p = 0;
que es asi como deberias escribirlo

Lo unico si usaras el macro para hacer el delete te iria mejor a la hora de correjir este error, en mi caso tengo que buscar uno a uno los delete y corregirlos a mano

esta muy linda, me la compro :)
pero no funciona con rvalues :/ pero igual.
template<class T> inline void safe_delete(T*& p) { delete p; p = 0; }

y por cierto si los parametros entre ( ) pueden ayudar un poco mas, pero en c++ tratamos de usar inlines y templates

Daemon

Aprovecho el post de Pogacha para poner otra cosa que siempre di por sentada, pero que me ha sorprendido.  Y es que el tipo char de C/C++ no admite caracteres que no sean del alfabeto inglés. Lo toma como un carácter multibyte, aunque tenga representación en ASCII, no importa si utilizáis el código ASCII en vez del carácter, no lo imprime correctamente.


#include <cstring>
#include <iostream>

using namespace std;
int main(void){

unsigned char a = '¿';
cout <<"El caracter a es "<<a<<endl;

return 0;
}


Tampoco lo muestra bien aunque establezcas el idioma con imbue.

Que cosas....
Imagina todo lo que puedes hacer. Despues hazlo.

Tei

Cita de: Daemon en 14 de Mayo de 2009, 05:17:42 PM
Aprovecho el post de Pogacha para poner otra cosa que siempre di por sentada, pero que me ha sorprendido.  Y es que el tipo char de C/C++ no admite caracteres que no sean del alfabeto inglés. Lo toma como un carácter multibyte, aunque tenga representación en ASCII, no importa si utilizáis el código ASCII en vez del carácter, no lo imprime correctamente.


#include <cstring>
#include <iostream>

using namespace std;
int main(void){

unsigned char a = '¿';
cout <<"El caracter a es "<<a<<endl;

return 0;
}


Tampoco lo muestra bien aunque establezcas el idioma con imbue.

Que cosas....

Pues la pregunta siguiente es.. en el fichero .cpp en el que has puesto unsigned char a = '¿';, que codificacion usa este fichero?, noslomismo latin1, utf8, o lo que sea.  Hay tres cosas que intervienen aqui, la codificacion del codigo fuente, la codificacion del stream este (si hace conversiones automaticas) y la codificacion de la consola.  A lo mejor un programa da una buena salida, y cambias la codificacion de la consola, y se dejan de ver ¿ por salida. 

Daemon

El programa está ejecutado en un sistema linux con bash, y si muestras el contenido del fichero mediante "cat prueba.cpp", lo imprime correctamente. La posibilidad que queda entonces, a menos que haya otra, en mi opinión es un poco bizarra y debe ser la causante. Es decir que el stream del cout esté imprimiendo cosas con otro encoding. ¿Un compilador gcc para un sistema linux que no coge la codificación utf-8?

Madre mia...  :o
Imagina todo lo que puedes hacer. Despues hazlo.

Pogacha

Pues sucede que cout es ASCII y lo que te sucede es lo esperado, no hay ningún error.
Si vas a utilizar caracteres fuera del ASCII, puedes usar la Wide Char (UTF16 o UTF32 dependiendo del sistema) que esta soportada por la STL y sino te queda codificarte tu propio stream que ande con utf8.

Daemon

Creo que el carácter '¿' no está fuera del conjunto de caracteres ASCII, de hecho tiene el código ASCII 168, que cabe perfectamente en un byte que es el tamaño de un char. Lo que sería extraño es que el tipo char (o unsigned char que para el caso da igual) cogiese sólo el conjunto básico de caracteres ASCII, del 0 al 127.

Imagina todo lo que puedes hacer. Despues hazlo.

Pogacha

Es que ascii esta definido solo desde 0 a 127. Lo otros son extensiones, que muchos han aprobechado para poner sus propios caracteres y de ahí los codepages.

http://www.jimprice.com/jim-asc.shtml

CitarQ:  What are the ASCII codes for things like the degrees symbol (°), the trademark symbol, solid blocks and other special symbols?
A: The answer is "it depends". There's really not an ASCII character for most of the special characters (other than those shown in the table at the top of this page. However, there are different extended ASCII sets that include a lot more special characters. (See IBM PC Extended ASCII, below.) Also, for information about including special symbols on a web page, you might look at some of the other charts and references, below.

Netto22

Aprovecho la tematica del hilo para lanzar una preguntita referente a los chars...

Para que me saque la letra tengo que poner el cstring no? sin el incluido no me sacaria sino que el valor numerico aun declarando la variable en char cierto?

Otra pregunta que queria hacer es que tipo de variable es la mas adecuada para un char, el unsigned o ya tirando a long o double?

Pogacha

No te entendí mucho pero, la STL funciona con char o wchar_t
Para caracteres que no esten en la tabla ascii tenés que usar wchar_t en la std::basic_string, la que por comodidad esta declarada como std::wstring y supuestamente wcout (pues en realidad nunca lo he utilizado).

Pero lo que veo es que te falta mucha teoria al respecto asi que puedes empezar leyendote esto:
http://www.joelonsoftware.com/articles/Unicode.html

Netto22

No recuerdo bien bien el codigo que tenia yo escrito, pero si se que me devolvia un valor numerico y no un char como queria, probare con unsigned a ver y revisare que tenga el include cstring.

Daemon

Cita de: Pogacha en 16 de Mayo de 2009, 02:03:44 PM
Es que ascii esta definido solo desde 0 a 127. Lo otros son extensiones, que muchos han aprobechado para poner sus propios caracteres y de ahí los codepages.

http://www.jimprice.com/jim-asc.shtml

CitarQ:  What are the ASCII codes for things like the degrees symbol (°), the trademark symbol, solid blocks and other special symbols?
A: The answer is "it depends". There's really not an ASCII character for most of the special characters (other than those shown in the table at the top of this page. However, there are different extended ASCII sets that include a lot more special characters. (See IBM PC Extended ASCII, below.) Also, for information about including special symbols on a web page, you might look at some of the other charts and references, below.


El maravilloso mundo de los "estándares",  en fin...

Un saludo a todos :)

Imagina todo lo que puedes hacer. Despues hazlo.






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.