Operador delete (C++)

Desaloca um bloco de memória.

Syntax

[::] deleteexpressão de conversão
[::] delete []expressão de conversão

Comentários

O argumento de expressão de conversão deve ser um ponteiro para um bloco de memória alocado anteriormente para um objeto criado com o novo operador. O delete operador tem um resultado de 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 new fornece 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 caso de falha, excluir o resultado de uma operação com falha new é inofensiva. Para obter mais informações, consulte Os operadores novos e excluídos.

Os new operadores e os delete operadores também podem ser usados para tipos internos, incluindo matrizes. Se pointer fizer referência a uma matriz, coloque colchetes vazios ([]) antes pointerde:

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

Usar o delete operador 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 de um 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 delete operador 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 delete operador será definido como um valor inválido após a exclusão do objeto.

Usando delete

Há duas variantes sintacticas para o operador de exclusão: uma para objetos únicos e outra para matrizes de objetos. O fragmento de código a seguir mostra como eles 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 de matriz de exclusão (delete []) em um objeto e usando a forma nãoarray de exclusão em uma matriz.

Exemplo

Para obter exemplos de uso delete, consulte o novo operador.

Como a exclusão funciona

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

Para objetos que não são do tipo de classe (classe, struct ou união), o operador de exclusão global é invocado. Para objetos do tipo de classe, o nome da função de desalocação será resolvido no escopo global se a expressão de exclusão começar com o operador de resolução de escopo unário (::). 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 novos e excluídos