Entonces, si declaro el siguiente código

int main() {
   char* c = new char[20];
   delete c;
   return 0;
}

¿Por qué no tengo pérdida de memoria? No es la forma correcta de borrar

delete[] c;

Ambas formas funcionan y no tengo pérdida de memoria en ninguna.

c++
2
Yusuf Jama 15 dic. 2016 a las 10:17

2 respuestas

La mejor respuesta

La primera forma en que no funciona. Simplemente parece que funciona.

Esto se conoce como Comportamiento no definido : C ++ no No tome su mano si hace algo mal. Le permite al compilador asumir que usted no comete ciertos tipos de errores, porque verificar estos errores ralentizaría su programa.

Si escribe Comportamiento indefinido, su programa podría hacer cualquier cosa . Incluso:

"Parece que funciona perfectamente" es en realidad el peor de estos, porque no se da cuenta de que tiene un error. Hasta que, por ejemplo, lo transfiera a una plataforma diferente, o obtenga una nueva versión del compilador, o algo más cambie, y luego comience a obtener resultados extraños, pero por supuesto, este código ha funcionado durante años, por lo que no es posible que su código sea incorrecto ... ¿verdad?

Los buenos compiladores se quejarán de algunos de estos tipos de errores de todos modos, aunque no sea necesario, especialmente si activa advertencias adicionales. Además, las herramientas de análisis estático pueden ayudarlo a detectar más errores. (Simplemente busque ese término; hacer recomendaciones estaría explícitamente fuera de tema aquí).

5
BoBTFish 15 dic. 2016 a las 07:54

Ambas formas no funcionarán. Si asigna una matriz usando new [], debe eliminarla usando delete []. Período. De lo contrario, es un comportamiento indefinido.

Nota: Si la primera forma se compila y se ejecuta, no significa que esté funcionando. Es un comportamiento indefinido. Cualquier cosa puede suceder. Su programa podría fallar. Puede que no. Nada se puede decir definitivamente.

1
user3286661 15 dic. 2016 a las 07:22