O delete[]
operador é usado para excluir matrizes. O delete
operador é usado para excluir objetos que não são da matriz. Ele chama operator delete[]
e operator delete
funciona, respectivamente, para excluir a memória que o objeto da matriz ou não matriz ocupou após (eventualmente) chamar os destruidores dos elementos da matriz ou do objeto que não é da matriz.
O seguinte mostra as relações:
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 o new
que cria uma matriz (portanto, new type[]
ou new
aplicada a uma construção de tipo de matriz), o Padrão procura um operator new[]
na classe de tipo de elemento da matriz ou no escopo global e passa a quantidade de memória solicitada. Ele pode solicitar mais do N * sizeof(ElementType)
que deseja (por exemplo, armazenar o número de elementos, portanto, mais tarde, ao excluir, sabe quantas chamadas de destruidor devem ser feitas). Se a classe declarar operator new[]
que um adicional à quantidade de memória aceita outro size_t
, esse segundo parâmetro receberá o número de elementos alocados - poderá usá-lo para qualquer finalidade que desejar (depuração, etc ...).
Para o new
que cria um objeto que não é de matriz, ele procurará um operator new
na classe do elemento ou no escopo global. Passa a quantidade de memória solicitada (exatamente sizeof(T)
sempre).
Para o delete[]
, ele examina o tipo de classe de elemento dos arrays e chama seus destruidores. A operator delete[]
função usada é a da classe do tipo de elemento ou, se não houver, no escopo global.
Para o delete
, se o ponteiro passado é uma classe base do tipo de objeto real, a classe base deve ter um destruidor virtual (caso contrário, o comportamento é indefinido). Se não for uma classe base, o destruidor dessa classe será chamado e um operator delete
nessa classe ou no global operator delete
será usado. Se uma classe base foi aprovada, o destruidor do tipo de objeto real é chamado e o operator delete
encontrado nessa classe é usado, ou, se não houver, um global operator delete
é chamado. Se o operator delete
na classe tiver um segundo parâmetro do tipo size_t
, ele receberá o número de elementos a serem desalocados.