16

En C++, si desea asignar dinámicamente una matriz, se puede hacer algo como esto:¿Por qué el compilador requiere `delete [] p` versus` delete p [] `?

int *p; 
p = new int[i]; // i is some number 

Sin embargo, para eliminar la matriz, lo haces ...

delete[] p; 

Por qué ISN' ¿Es delete p[]? ¿No sería eso más simétrico de cómo se creó originalmente? ¿Cuál es la razón (si hay alguna) por qué el lenguaje fue diseñado de esta manera?

+8

¿Por qué declinar/votar para cerrar? ¿Qué puedo hacer para mejorar la pregunta? – Michael0x2a

+5

@Deflect: Eso era mío, generalmente '¿por qué se eligió este lenguaje?' las preguntas simplemente no son constructivas porque no hay una respuesta objetiva y razonable. Sin embargo, en este caso hay algunas razones decentes, por lo que puede haber juzgado demasiado pronto (me quité mi voto grave con bastante rapidez). – KillianDS

+1

@KillianDS: Bien, eso tiene sentido. ¡Gracias por responder! [y asegurándome que no estoy totalmente fuera de la base :)] – Michael0x2a

Respuesta

29

Una razón podría ser hacer que estos casos sean más claros.

int ** p; 
delete[] p 
delete p[1]; 

Si fuera delete p[] entonces un error de un personaje tendría consquences bastante desagradables.

+13

Esto es especialmente cierto, ya que en C++ temprano, tenía que especificar la cantidad de elementos en '[]'. –

+4

@JamesKanze: Parece que esa es la respuesta para mí. 'delete p [4]' sería ambiguo. – GManNickG

+0

@GManNickG Exactamente. –

2

Porque la matriz se desintegra al puntero al pasar como parámetro a la función (u operador). Entonces eliminar p [] sería simplemente equivalente a eliminar p.

[editar] Podemos pensar en eliminar como operador de plantilla especial. El operador debería ser capaz de distinguir entre p y p [] para seleccionar la "especialización" correcta (eliminación no de matriz o matriz). Sin embargo, las reglas de deducción de argumento de la plantilla hacen que esta elección sea imposible (debido a la disminución de la matriz, no podemos distinguir entre p [] y p al deducir el argumento).

Así que no podemos usar el operador con el nombre eliminar tanto casees y la necesidad de introducir otro operador delete [] con el nombre de diversa (sufijo [] puede ser tratada como parte del nombre del operador) para el caso de la matriz.

[editar 2] Nota. delete p [] no es válido sintax en absoluto según el estándar actual. El razonamiento anterior solo muestra problemas que podrían surgir si intentáramos interpretar eliminar p [] usando conceptos de C++ existentes.

+0

No, no es equivalente. Usar uno en lugar de otro es un comportamiento indefinido. – sharptooth

+0

@sharptooth:? pasar una matriz a la función de plantilla en lugar de puntero es UB? Pienso en eliminar como sobre el operador con plantilla y este operador no puede elegir la especialización correcta porque no puede distinguirse entre p [] yp al deducir el argumento.Entonces, necesitamos introducir un operador especial delete [] para matrices en lugar de usar el mismo nombre de operador – user396672

+0

Pasar un puntero devuelto por 'new' a' delete [] 'es UB – sharptooth