¿Cuál es la diferencia entre eliminar y eliminar []?
¿ Cuál es la diferencia entre delete
los delete[]
operadores y en C++?
El delete
operador 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 delete
de un puntero devuelto por new []
o delete []
de un puntero devuelto por da como new
resultado un comportamiento indefinido.
El delete[]
operador se utiliza para eliminar matrices. El delete
operador se utiliza para eliminar objetos que no son de matriz. Llama operator delete[]
y operator delete
funciona 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 new
que crea una matriz (es decir, ya sea new type[]
o new
aplicado 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 new
que crea un objeto que no es una matriz, buscará un operator new
en 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 delete
en esa clase o el global . operator delete
Si se pasó una clase base, entonces se llama al destructor del tipo de objeto real y operator delete
se usa el encontrado en esa clase, o si no hay ninguno, operator delete
se llama a un global. Si la operator delete
clase tiene un segundo parámetro de tipo size_t
, recibirá la cantidad de elementos para desasignar.
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 delete
ydelete[]
1) delete
se 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 ptr
para este caso, el compilador no sabrá a cuántos objetos ptr
apunta 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 [] ptr
en este caso.