2012-06-12 4 views
5

¿Es difícil implementar la eliminación de una matriz con una sola palabra clave? ¿Es menos eficiente?¿Por qué C++ todavía tiene un delete [] Y un operador de eliminación?

+3

Dudo en marcar esto como * No es una pregunta real *, aunque quizás no esté bien formulada, sí pide los desafíos técnicos detrás de la unificación; Creo que esos podrían abordarse. –

+0

Pregunta relacionada: http://stackoverflow.com/q/703691/10077 –

Respuesta

-3

Las características como esta no pueden simplemente abandonarse del evento de idioma si fue fácil de implementar. ¿Te ofreces de voluntario para arreglar todo mi código después de dicho cambio?

+1

Podrían haber desaprobado la sintaxis 'delete []' si estaba obsoleta sin soltarla, y tener una implementación conforme delegar una a la otra. –

+0

No tuvieron ningún problema en desaprobar 'auto_ptr' –

+0

' auto_ptr' es una clase de biblioteca, no el constructo de lenguaje, por lo que no es lo mismo, y el mandato de complicar una característica útil es completamente estúpido, si me preguntan. –

6

El problema no es la complejidad, sino el hecho de que el argumento delete es un puntero único, y ese tipo es exactamente igual si asignó un elemento individual o una matriz. Debajo de la implementación es bastante diferente, ya que la cantidad de elementos destruidos difiere.

Esto es en realidad un problema con la compatibilidad con C ... Si no hubiera sido un requisito desde el principio probablemente no tendríamos C++ (no habría alcanzado tanto) pero el tipo de new T[N] podría ser diferente del tipo de new T y el sistema de tipo se podría usar para detectar a qué delete se debe llamar.

+1

Supongo que el OP realmente se está preguntando por qué 'new T' es diferente a' new T [1] '. –

+0

, lo que podría llevar a uno a preguntar: "Si estoy' nuevo' haciendo una serie de Gizmos, ¿alguna vez realmente querría llamar al constructor en la primera? " –

+2

@OliCharlesworth Como dije en mi respuesta: 'new T [1]' tiene una sobrecarga adicional, y no debería tener que pagar por lo que no usa. –

16

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

Uno podría doblar estos en la misma operación: "llama al destructor de algunos número de objetos y desasigna la memoria.". Después de todo uno es un número.

Ambos delete y delete[] funcionan con un puntero. Como este:

foo* ptr; 

Míralo detenidamente. Y dime cuántos destructores se deben llamar cuando lo delete. No puedes. Y tampoco puede el compilador. Esto solo puede conocerse en tiempo de ejecución. La información sobre el número de objetos debe almacenarse en algún lugar. 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 formularios que no son de matriz: desde delete siempre se elimina un solo objeto, new no necesita asignar cualquier extra.

+0

Más exactamente, este es un problema heredado. Sería trivial hacer 'delete (1, ptr)' y 'delete (expression, ptr);' Todos saben cuántos elementos tienen. – Puppy

+2

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

+0

@ user315052 ¿Y qué? 'malloc' no es' nuevo'. No puede 'borrar' algo que' malloc'ed. –

5

Es porque uno de los principios primordiales del diseño C++ es que no pague por lo que no usa. new[]/delete[] tienen costo adicional, y se consideró que su utilidad (nunca he utilizado entonces en 25 años de C++.) Se limitó suficiente como para que no justificaba la adición de este costo a no es un array new/delete .

Cuestiones relacionadas