¿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?
Respuesta
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?
Podrían haber desaprobado la sintaxis 'delete []' si estaba obsoleta sin soltarla, y tener una implementación conforme delegar una a la otra. –
No tuvieron ningún problema en desaprobar 'auto_ptr' –
' 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. –
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.
Supongo que el OP realmente se está preguntando por qué 'new T' es diferente a' new T [1] '. –
, 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? " –
@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. –
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.
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
Malloc sabe cuánta memoria se asignó para la solicitud de asignación. 'delete' podría haber consultado la misma información. – jxh
@ user315052 ¿Y qué? 'malloc' no es' nuevo'. No puede 'borrar' algo que' malloc'ed. –
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
.
- 1. ¿Por qué incluso necesitamos el operador "delete []"?
- 2. Por qué "delete [] [] ... multiDimensionalArray;" el operador en C++ no existe
- 3. ¿Por qué hay una eliminación [] en C++?
- 4. C++ delete tabla de sintaxis del operador
- 5. Como el operador de eliminación desasigna la memoria, ¿por qué necesito un destructor?
- 6. ¿Por qué se invoca "operador delete" cuando llamo "eliminar" en un puntero nulo?
- 7. ¿Puede C++ 0x todavía asignar explícitamente con operador global nuevo?
- 8. ¿Por qué se requiere que el operador de eliminación sea estático?
- 9. ¿Qué es un operador sobrecargado en C++?
- 10. ¿Cómo declaras y utilizo la eliminación de un operador de la piscina sobrecargado?
- 11. Operador de mezcla nuevo [] y colocación nuevo con eliminación normal []
- 12. Eliminación de un objeto en C++
- 13. ¿Por qué hay un operador sizeof ... en C++ 0x?
- 14. does python tiene un operador de coma como C
- 15. ¿Por qué `: =` funciona como un operador infijo?
- 16. ¿Qué determina qué se escribe en un puntero de C++ cuando se llama a delete?
- 17. ¿Por qué C# HashSets tiene un método Distinct()
- 18. ¿Por qué el compilador requiere `delete [] p` versus` delete p [] `?
- 19. ¿por qué preferimos? a ?? operador en C#?
- 20. ¿Por qué Python tiene un método de operador __ne__ en lugar de solo __eq__?
- 21. ¿Tiene esta característica C# un nombre y qué hace?
- 22. ¿Por qué el operador = ~ solo a veces tiene efectos secundarios?
- 23. ¿Por qué auto_ptr <T> tiene operador!() Definido?
- 24. En C# ¿Por qué no puede un operador condicional implícita echado a un tipo anulable
- 25. C++ delete - ¿Elimina mis objetos pero todavía puedo acceder a los datos?
- 26. ¿Por qué boost no tiene un make_scoped()?
- 27. ¿PHP tiene un equivalente al operador || =?
- 28. por qué no hay un método de eliminación en HttpWebResponse
- 29. ¿Por qué el operador postfix ++ tiene mayor prioridad que el operador prefijo ++?
- 30. C# eliminación de un controlador de eventos
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. –
Pregunta relacionada: http://stackoverflow.com/q/703691/10077 –