¿Cuál es la diferencia entre deletey 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á regularmentedeleteen la matriz, que es un comportamiento indefinido. En cambio, debe usarstd::unique_ptr<int[]>Respuestas:
El
deleteoperador 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
deleteen un puntero devuelto pornew []odelete []en un puntero devuelto pornewresultados en un comportamiento indefinido.fuente
El
delete[]operador se utiliza para eliminar matrices. Eldeleteoperador se utiliza para eliminar objetos que no son de matriz. Llamaoperator delete[]yoperator deletefunciona 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
newque crea una matriz (por lo tanto,new type[]o senewaplica 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
newque crea un objeto sin matriz, buscará unoperator newen 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 deleteen esa clase o el globaloperator delete. Si se pasó una clase base, se llama al destructor del tipo de objeto real, yoperator deletese utiliza el encontrado en esa clase, o si no hay ninguno,operator deletese llama a un global . Sioperator deleteen 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
deleteydelete[]1)
deletese 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 ptrpara este caso, el compilador no sabrá a cuántos objetosptrapunta 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 [] ptren este caso.fuente
free()esto y aquello. Si usa un patrón de pseudodestructor, debe llamarlo una vez por cada objeto que use unforbucle.Los operadores
deleteydelete []se utilizan respectivamente para destruir los objetos creados connewynew[], volviendo a la memoria asignada que queda disponible para el administrador de memoria del compilador.Los objetos creados con
newnecesariamente 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
deletese 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
deletey el operadordelete[]se distinguen, pero eldeleteoperador también puede liberar la matriz.Y ya comprobado que este código no tiene fuga de memoria.
fuente