segmentation guidelines dumped c++ language-design dynamic-memory-allocation delete-operator

c++ - guidelines - ¿Por qué el compilador requiere `delete[] p` contra` delete p[] `?



segmentation fault linux (2)

Porque la matriz decae al puntero cuando pasa como parámetro a 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 debe poder distinguir entre p y p [] para elegir la "especialización" correcta (eliminación sin matriz o matriz). Sin embargo, las reglas de deducción de argumentos de la plantilla hacen que esta elección sea imposible (debido a la descomposición de la matriz, no podemos distinguir entre p [] yp cuando se deduce el argumento).

Por lo tanto, no podemos utilizar el operador con eliminación de nombre para ambos casos y necesitamos introducir otro operador eliminado [] con nombre diferente (el sufijo [] puede tratarse como parte del nombre del operador) para el caso de matriz.

[editar 2] Nota. delete p [] no es sintaxis válida en absoluto de acuerdo con el estándar actual. El razonamiento anterior solo muestra los problemas que podrían surgir si intentáramos interpretar delete p [] utilizando los conceptos de c ++ existentes.

En C ++, si desea asignar dinámicamente una matriz, puede hacer algo como esto:

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

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

delete[] p;

¿Por qué no se delete p[] ? ¿No sería eso más simétrico con la forma en que se creó originalmente? ¿Cuál es la razón (si existe) por la cual el lenguaje fue diseñado de esta manera?


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

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

Si se delete p[] entonces un error de un carácter tendría consecuencias bastante desagradables.