¿Por qué C ++ todavía tiene un operador de eliminación [] Y de eliminación? [cerrado]

¿Es difícil implementar la eliminación de una matriz con una sola palabra clave? ¿Es menos eficiente?

preguntado el 12 de junio de 12 a las 16:06

Dudo en marcar esto como No es una pregunta real, aunque tal vez no esté muy bien expresado, sí pregunta por los desafíos técnicos detrás de la unificación; Creo que esos podrían ser abordados. -

4 Respuestas

Primero, permítanme resumir lo que ambos hacen: delete llama a un destructor para una objeto y desasigna la memoria; delete[] llama al destructor de algo número de objetos y desasigna la memoria.

Uno podría plegarlos en la misma operación: "llama al destructor de algo número de objetos y desasigna la memoria". Después de todo una is algo número.

Ambos delete and delete[] operar sobre un puntero. Como éste:

foo* ptr;

Míralo de cerca. Y dime cuántos destructores se deben llamar cuando delete eso. no puedes Y así no puede el compilador. Esto solo se puede saber en tiempo de ejecución. La información sobre el número de objetos tiene que ser almacenada en alguna parte. Eso significa que, para cada uso de new[], hay algo de memoria adicional asignada para realizar un seguimiento de ese número.

C ++ se basa en el principio de "no paga por lo que no usa", y es por eso que existen las formas que no son de matriz: ya que delete siempre solo borra un objeto, new no necesita asignar ningún extra.

Respondido el 12 de junio de 12 a las 16:06

Más exactamente, este es un problema heredado. Sería trivial hacerlo delete(1, ptr) and delete(expression, ptr); Todo el mundo sabe cuántos elementos tiene. - Cachorrito

Malloc sabe cuánta memoria se asignó para la solicitud de asignación. delete podría haber consultado la misma información. - jxh

@R.MartinhoFernandes: si la biblioteca C se amplía para informar cuánta memoria se asignó para un puntero, entonces C++ podría permitir fácilmente delete comportarse como delete[], Saludos. - jxh

@user315052 No. Incluso si ese fuera el caso, la información almacenada por malloc es la información incorrecta. Es el cantidad de almacenamiento asignado en algún bloque, que generalmente está alineado con algún límite especial y, por lo tanto, puede tener más que el tamaño real de los objetos construidos allí. Pero que delete[] necesidades es la número de objetos, no el tamaño del almacenamiento asignado para ellos. malloc no almacena eso porque esto es irrelevante en C: no hay destructores. - R. Martinho Fernández

@DeadMG ¿En serio? Deberías ver lo que la gente en C hace con las cadenas. En general, no necesita (ni siquiera desea) la cantidad de elementos asignados, desea la cantidad de elementos que son válidos. si no sabes cuantos char o el double vas a leer, asignas un millón, y devuelves el puntero, con una cuenta de 10, porque eso es lo que realmente lees. - james kanze

El problema no es la complejidad, sino el hecho de que el argumento para delete es un solo puntero, y ese tipo es exactamente el mismo ya sea que haya asignado un solo elemento o una matriz. Debajo, la implementación es bastante diferente, ya que la cantidad de elementos destruidos difiere.

Esto es en realidad un problema con tener compatibilidad con versiones anteriores de C... si eso no hubiera sido un requisito desde el principio, probablemente no tendríamos C++ (no se habría puesto al día tanto), pero el tipo de new T[N] podría ser diferente del tipo de new T y el sistema de tipos podría usarse para detectar qué delete necesitaba ser llamado.

Respondido el 12 de junio de 12 a las 16:06

Supongo que el OP realmente está preguntando por qué. new T es diferente a new T[1]. - Oliver Charlesworth

Lo que podría llevar a uno a preguntarse: "Si estoy newing una matriz de Gizmos, ¿alguna vez realmente querría llamar al constructor solo en el primero?" - Juan Dibling

@OliCharlesworth Como dije en mi respuesta: new T[1] tiene gastos generales adicionales, y no debería tener que pagar por lo que no usa. - james kanze

Es porque uno de los principios primordiales del diseño de C++ es que no paga por lo que no usa. new[]/delete[] tienen un costo adicional, y se consideró que su utilidad (nunca la he usado en 25 años de C ++) era lo suficientemente limitada como para no justificar agregar este costo a no matriz new/delete.

Respondido el 12 de junio de 12 a las 16:06

Características como esta no se pueden eliminar del evento de idioma si fuera fácil de implementar. ¿Se ofrece como voluntario para venir y arreglar todo mi código después de dicho cambio?

Respondido el 12 de junio de 12 a las 16:06

Podrían haber desaprobado el delete[] sintaxis si estaba obsoleta sin descartarla, y tener una implementación conforme delegada una a la otra. - marca rescate

No tuvieron problema en desaprobar auto_ptr - Juan Dibling

auto_ptr es una clase de biblioteca, no la construcción del lenguaje, por lo que no es lo mismo, y obligar a complicar una característica útil es completamente estúpido, si me preguntas. - Nikolái Fetissov

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.