¿Cuál es la diferencia entre delete
y delete[]
operadores en C ++?
c++
memory-management
delete-operator
shreyasva
fuente
fuente
vector<>
lugar de una matriz siempre que puedo.std::unique_ptr<int>(new int[3])
, por ejemplo , porque llamará regularmentedelete
en la matriz, que es un comportamiento indefinido. En cambio, debe usarstd::unique_ptr<int[]>
Respuestas:
El
delete
operador desasigna memoria y llama al destructor para un solo objeto creado connew
.El
delete []
operador desasigna la memoria y llama a los destructores para una matriz de objetos creados connew []
.El uso
delete
en un puntero devuelto pornew []
odelete []
en un puntero devuelto pornew
resultados en un comportamiento indefinido.fuente
El
delete[]
operador se utiliza para eliminar matrices. Eldelete
operador se utiliza para eliminar objetos que no son de matriz. Llamaoperator delete[]
yoperator delete
funciona respectivamente para eliminar la memoria que ocupó la matriz o el objeto no matriz después (eventualmente) de llamar a los destructores para los elementos de la matriz o el objeto no matriz.A continuación se muestran las relaciones:
Para el
new
que crea una matriz (por lo tanto,new type[]
o senew
aplica a una construcción de tipo de matriz), el Estándar busca unaoperator new[]
clase de tipo de elemento de la matriz o en el ámbito global, y pasa la cantidad de memoria solicitada. Puede solicitar más deN * sizeof(ElementType)
lo que quiere (por ejemplo, almacenar el número de elementos, por lo que más tarde, al eliminar, sabe cuántas llamadas de destructor se realizarán). Si la clase declaraoperator new[]
que un adicional a la cantidad de memoria acepta otrosize_t
, ese segundo parámetro recibirá el número de elementos asignados; puede usar esto para cualquier propósito que desee (depuración, etc.).Para el
new
que crea un objeto sin matriz, buscará unoperator new
en la clase del elemento o en el ámbito global. Pasa la cantidad de memoria solicitada (exactamentesizeof(T)
siempre).Para
delete[]
ello, analiza el tipo de clase de elemento de las matrices y llama a sus destructores. Laoperator delete[]
función utilizada es la de la clase del tipo de elemento, o si no hay ninguna en el ámbito global.Para el
delete
, si el puntero pasado es una clase base del tipo del objeto real, la clase base debe tener un destructor virtual (de lo contrario, el comportamiento no está definido). Si no es una clase base, se llama al destructor de esa clase y se usa unoperator delete
en esa clase o el globaloperator delete
. Si se pasó una clase base, se llama al destructor del tipo de objeto real, yoperator delete
se utiliza el encontrado en esa clase, o si no hay ninguno,operator delete
se llama a un global . Sioperator delete
en la clase tiene un segundo parámetro de tiposize_t
, recibirá el número de elementos para desasignar.fuente
Este es el uso básico del patrón de asignación / DE-asignación en c ++
malloc
/free
,new
/delete
,new[]
/delete[]
Necesitamos usarlos correspondientemente. Pero me gustaría agregar esta comprensión particular de la diferencia entre
delete
ydelete[]
1)
delete
se utiliza para desasignar memoria asignada para un solo objeto2)
delete[]
se utiliza para desasignar la memoria asignada para una matriz de objetoscuando decimos
new ABC[100]
, el compilador puede obtener la información sobre cuántos objetos hay que asignar (aquí son 100) y llamará al constructor para cada uno de los objetos creadospero correspondientemente si simplemente usamos
delete ptr
para este caso, el compilador no sabrá a cuántos objetosptr
apunta y terminará llamando al destructor y eliminando memoria para solo 1 objeto (dejando la invocación de los destructores y la desasignación de los 99 objetos restantes). Por lo tanto, habrá una pérdida de memoria.entonces necesitamos usar
delete [] ptr
en este caso.fuente
free()
esto y aquello. Si usa un patrón de pseudodestructor, debe llamarlo una vez por cada objeto que use unfor
bucle.Los operadores
delete
ydelete []
se utilizan respectivamente para destruir los objetos creados connew
ynew[]
, volviendo a la memoria asignada que queda disponible para el administrador de memoria del compilador.Los objetos creados con
new
necesariamente deben destruirse condelete
, y las matrices creadas connew[]
deben eliminarse condelete[]
.fuente
Cuando hice esta pregunta, mi pregunta real fue: "¿hay alguna diferencia entre los dos? ¿No tiene que mantener el tiempo de ejecución información sobre el tamaño de la matriz, por lo que no será capaz de decir a qué nos referimos?" Esta pregunta no aparece en "preguntas relacionadas", así que solo para ayudar a aquellos como yo, aquí está la respuesta a eso: "¿por qué necesitamos el operador eliminar []?"
fuente
delete
se usa para un solo puntero ydelete[]
se usa para eliminar una matriz a través de un puntero. Esto podría ayudarlo a comprender mejor.fuente
Bueno ... tal vez creo que es solo para explícito. El operador
delete
y el operadordelete[]
se distinguen, pero eldelete
operador también puede liberar la matriz.Y ya comprobado que este código no tiene fuga de memoria.
fuente