2012-02-11 13 views
14

he descubierto el error clásico de new/delete desajuste en nuestra base de código de la siguiente manera:¿Qué tan grave es el error de desajuste del operador nuevo/eliminar?

char *foo = new char[10]; 

// do something 

delete foo; // instead of delete[] foo; 

¿Qué tan grave es esto? ¿Causa una pérdida de memoria o error? Cuáles son las consecuencias. Tenemos algunos problemas de memoria, pero esto no parece lo suficientemente grave como para explicar todos los síntomas (daños en el montón, etc)

EDIT: preguntas adicionales para mayor claridad
¿Se acaba de liberar el primer miembro de la matriz? o
¿Hace que el sistema pierda la pista de la matriz? o
¿La memoria dañada es de alguna manera?

Respuesta

16

Es un comportamiento indefinido serio (podría funcionar, podría fallar, podría hacer otra cosa).

+0

Gracias por la respuesta rápida. Entonces realmente indefinido? Como en, nadie puede decir lo que podría pasar? Si eso es así, podría explicar nuestras observaciones. –

+0

@AndrewS. De hecho indefinido. Recuerdo que "funcionó" en Visual Studio, por ejemplo. – cnicutar

+2

Indefinido, es decir, depende del compilador/sistema operativo. –

8

A primera vista, llamar a delete en lugar de delete[] no debería ser muy malo: destruyes el primer objeto y provocas una pérdida de memoria.

PERO: entonces, delete (o delete[]) llama free para liberar la memoria. Y free necesita su dirección originalmente asignada, para liberar la memoria correctamente. O bien, el asunto es que, mientras new devuelve la dirección original asignada por malloc, new[] devuelve una dirección diferente.

Llamar gratis a la dirección devuelta por new[] provoca un bloqueo (libera la memoria de forma caótica).

Consulte estos enlaces muy instructivas para una mejor comprensión:

http://blogs.msdn.com/b/oldnewthing/archive/2004/02/03/66660.aspx#66782

http://web.archive.org/web/20080703153358/http://taossa.com/index.php/2007/01/03/attacking-delete-and-delete-in-c

A partir de estos artículos es también evidente por qué llaman delete[] en lugar de delete es también una muy mala idea.

Por lo tanto, para responder: sí, es un error muy grave. Corrompe la memoria (después de llamar al destructor del primer objeto solamente).

Cuestiones relacionadas