Operador delete (C++)

Desaloca um bloco de memória.

Sintaxe

[::] deletecast-expression
[::] delete []cast-expression

Comentários

O argumento cast-expression deve ser um ponteiro para um bloco de memória alocado anteriormente para um objeto criado com o new operator. O operador delete tem um resultado do tipo void e, portanto, não retorna um valor. Por exemplo:

CDialog* MyDialog = new CDialog;
// use MyDialog
delete MyDialog;

Usar delete em um ponteiro para um objeto não alocado com new traz resultados imprevisíveis. No entanto, você pode usar delete em um ponteiro com o valor 0. Essa provisão significa que, quando new retorna 0 em falha, a exclusão do resultado de uma falha na operação new é inofensiva. Para obter mais informações, consulte Os operadores new e delete.

Os operadores new e delete também podem ser usados para tipos internos, incluindo matrizes. Se pointer referir-se a uma matriz, coloque parênteses vazios ([]) antes de pointer:

int* set = new int[100];
//use set[]
delete [] set;

Usar o operador delete em um objeto desaloca sua memória. Um programa que remova a referência de um ponteiro após a exclusão do objeto pode ter resultados imprevisíveis ou falhar.

Quando delete é usado para desalocar a memória para o objeto de classe C++, o destruidor do objeto é chamado antes que a memória do objeto seja desalocada (se o objeto tiver um destruidor).

Se o operando para o operador delete for um l-value modificável, seu valor será indefinido após a exclusão do objeto.

Se a opção do compilador /sdl (Habilitar verificações de segurança adicionais) for especificada, o operando para o operador delete será definido como um valor inválido após a exclusão do objeto.

Usando delete

Há duas variantes sintáticas para o operador delete: uma para objetos únicos e o outra para matrizes de objetos. O fragmento de código a seguir mostra como elas se diferem:

// expre_Using_delete.cpp
struct UDType
{
};

int main()
{
   // Allocate a user-defined object, UDObject, and an object
   //  of type double on the free store using the
   //  new operator.
   UDType *UDObject = new UDType;
   double *dObject = new double;
   // Delete the two objects.
   delete UDObject;
   delete dObject;
   // Allocate an array of user-defined objects on the
   // free store using the new operator.
   UDType (*UDArr)[7] = new UDType[5][7];
   // Use the array syntax to delete the array of objects.
   delete [] UDArr;
}

Os dois casos a seguir produzem resultados indefinidos: usando a forma da matriz de delete (delete []) em um objeto e usando a forma de não matriz de delete em uma matriz.

Exemplo

Para obter exemplos de uso de delete, consulte operador new.

Como delete funciona

O operador delete invoca a função de exclusão do operador delete.

Para objetos que não forem do tipo de classe (class, struct ou union), o operador delete global será invocado. Em objetos do tipo de classe, o nome da função de desalocação é resolvido no escopo global se a expressão de exclusão começar com o operador unário de resolução de escopo (::). Caso contrário, o operador Delete invoca o destruidor para um objeto antes de desalocar a memória (se o ponteiro não for nulo). O operador delete pode ser definido em uma base por classe; se não houver nenhuma definição para uma classe específica, a exclusão global do operador é chamada. Se a expressão de exclusão for usada para desalocar um objeto da classe cujo tipo estático tem um destruidor virtual, a função de desalocação é resolvida pelo destruidor virtual do tipo dinâmico do objeto.

Confira também

Expressões com operadores unários
Palavras-chave
Operadores new e delete