C/Visual C - Que ocurre si hago un delete sin new

 
Vista:

Que ocurre si hago un delete sin new

Publicado por Lalo (11 intervenciones) el 22/01/2003 12:58:11
Qué sucede si hago un delete sin haber hecho antes un new. Por ejemplo
char *cad;
delete cad
¿Me da un casque al ejecutarlo?. ¿Tiene algo que ver que asigne cad=NULL ?
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:Que ocurre si hago un delete sin new

Publicado por Googol (255 intervenciones) el 22/01/2003 13:19:59
Puede pasar cualquier cosa, según la suerte (o mala suerte) que tengas.
Como cad no está inicializado, puede apuntar a cualquier sitio (no deberías suponer que siempre valdrá NULL). Por tanto, según el valor que tenga, ocurrirá una u otra cosa.
Por ejemplo, si cad es NULL, posiblemente salte una excepción específica de puntero a NULL (en Windows vigilan explícitamente los accesos a la posición 0 de memoria del proceso). Si apunta fuera de la memoria direccionable, aparecerá otra excepción. Si apunta, casualmente, a un bloque de memoria reservado por una instrucción new y manejado por otro puntero (... muy poco probable...) se liberará. Y si no,... seguramente se corrompan (modifiquen) algunos bytes de memoria que no deberían haber sido tocados.
En definitiva, nada bueno lo mires por donde lo mires.
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:Que ocurre si hago un delete sin new

Publicado por chuidiang (677 intervenciones) el 24/01/2003 10:00:05
Yo te cuento lo que pasa en unix

Si haces delete de un puntero que apunta a null, no pasa nada.

Si haces delete de un puntero que no es null, pero que tampoco has hecho new, no casca ni dice nada en el momento, pero corrompe al gestor de memoria dinamica de tu proceso y el programa puede cascar mas adelante, en cualquier sitio (generalmente en otro new o delete).

Si haces dos veces delete de la misma zona de memoria, aunque sea con punteros distintos, pasa lo mismo.

Como consejo, cuando declares un puntero inicializalo siempre a null. Asegurate de hacer un delete por cada new y solo uno. Cuando hagas el delete pon algo asi como

if (p != NULL)
{
delete p;
p = NULL;
}

De esta forma evitas problemas y solo tienes que tener cuidado de no hacer delete de dos punteros distintos que apunten a la misma zona de memoria (con lo que liberarias dicha zona dos veces, la primera bien, y la segunda provoca corrupción).

Si tienes problemas en algun momento con este tema, echa un ojo a mi pagina web, en la parte de trucos cpp. Hay una cosa sencillita que te puede ayudar a encontrar deletes incorrectos.

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