¿Cuál es la diferencia entre eliminar y eliminar []?

Resuelto shreyasva asked hace 14 años • 7 respuestas

¿ Cuál es la diferencia entre deletelos delete[]operadores y en C++?

shreyasva avatar Mar 11 '10 21:03 shreyasva
Aceptado

El deleteoperador desasigna memoria y llama al destructor para un único objeto creado con new.

El delete []operador desasigna memoria y llama a destructores para una matriz de objetos creados con new [].

El uso deletede un puntero devuelto por new []o delete []de un puntero devuelto por da como newresultado un comportamiento indefinido.

Nick Meyer avatar Mar 11 '2010 14:03 Nick Meyer

El delete[]operador se utiliza para eliminar matrices. El deleteoperador se utiliza para eliminar objetos que no son de matriz. Llama operator delete[]y operator deletefunciona respectivamente para eliminar la memoria que ocupaba la matriz o el objeto que no es una matriz después (eventualmente) de llamar a los destructores para los elementos de la matriz o el objeto que no es una matriz.

A continuación se muestran las relaciones:

typedef int array_type[1];

// create and destroy a int[1]
array_type *a = new array_type;
delete [] a;

// create and destroy an int
int *b = new int;
delete b;

// create and destroy an int[1]
int *c = new int[1];
delete[] c;

// create and destroy an int[1][2]
int (*d)[2] = new int[1][2];
delete [] d;

Para lo newque crea una matriz (es decir, ya sea new type[]o newaplicado a una construcción de tipo matriz), el Estándar busca una operator new[]en la clase de tipo de elemento de la matriz o en el alcance global, y pasa la cantidad de memoria solicitada. Puede solicitar más de N * sizeof(ElementType)lo que quiere (por ejemplo, almacenar la cantidad de elementos, para que luego, al eliminarlos, sepa cuántas llamadas al destructor se deben realizar). Si la clase declara operator new[]que adicional a la cantidad de memoria acepta otro size_t, ese segundo parámetro recibirá el número de elementos asignados; podrá usarlo para cualquier propósito que desee (depuración, etc.).

Para el newque crea un objeto que no es una matriz, buscará un operator newen la clase del elemento o en el ámbito global. Pasa la cantidad de memoria solicitada (exactamente sizeof(T)siempre).

Para delete[], busca el tipo de clase de elemento de las matrices y llama a sus destructores. La operator delete[]función utilizada es la de la clase del tipo de elemento, o si no hay ninguna, entonces en el ámbito global.

Para delete, si el puntero pasado es una clase base del tipo de objeto real, la clase base debe tener un destructor virtual (de lo contrario, el comportamiento no está definido). Si no es una clase base, entonces se llama al destructor de esa clase y se usa un operator deleteen esa clase o el global . operator deleteSi se pasó una clase base, entonces se llama al destructor del tipo de objeto real y operator deletese usa el encontrado en esa clase, o si no hay ninguno, operator deletese llama a un global. Si la operator deleteclase tiene un segundo parámetro de tipo size_t, recibirá la cantidad de elementos para desasignar.

Johannes Schaub - litb avatar Mar 11 '2010 14:03 Johannes Schaub - litb

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 en consecuencia. Pero me gustaría agregar esta comprensión particular de la diferencia entre deleteydelete[]

1) deletese utiliza para desasignar la memoria asignada para un solo objeto

2) delete[]se utiliza para desasignar la memoria asignada para una matriz de objetos

class ABC{}

ABC *ptr = new ABC[100]

cuando decimos new ABC[100], el compilador puede obtener información sobre cuántos objetos deben asignarse (aquí es 100) y llamará al constructor para cada uno de los objetos creados.

pero en consecuencia, si simplemente lo usamos delete ptrpara este caso, el compilador no sabrá a cuántos objetos ptrapunta y terminará llamando al destructor y eliminando memoria para solo 1 objeto (dejando la invocación de destructores y la desasignación de los 99 objetos restantes). Por tanto, habrá una pérdida de memoria.

entonces necesitamos usarlo delete [] ptren este caso.

ravs2627 avatar Jun 25 '2014 10:06 ravs2627