Partilhar via


Função de operador delete

Memória alocada dinamicamente usando o nova operador pode ser liberado usando o Excluir operador.As chamadas de operador delete a Excluir do operador função, que libera a memória de volta para o pool disponível.Usando o Excluir operador também faz com que o destruidor de classe (se houver algum) a ser chamado.

Há global e o escopo de classe Excluir do operador funções.Apenas um Excluir do operador função pode ser definida para uma determinada classe; Se definido, oculta o global Excluir do operador função.O global Excluir do operador função é sempre chamada para matrizes de qualquer tipo.

O global Excluir do operador função, se declarada, usa um único argumento do tipo void *, que contém um ponteiro para o objeto a ser desalocada.O tipo de retorno é void (Excluir do operador não pode retornar um valor).Dois formulários existem para o membro da classe Excluir do operador funções:

void operator delete( void * );
void operator delete( void *, size_t );

Apenas uma das duas variantes do anteriores pode estar presente para uma determinada classe.O primeiro formulário funciona como descrito para global operator delete.O segundo formulário leva dois argumentos, dos quais o primeiro é um ponteiro para o bloco de memória a ser desalocada e o segundo dos quais é o número de bytes a ser desalocada.O segundo formulário é particularmente útil quando um Excluir do operador a função de uma classe base é usada para excluir um objeto de uma classe derivada.

O Excluir do operador função é estática; Portanto, não pode ser virtual.O operator delete função obedece ao controle de acesso, conforme descrito em O controle de acesso de membro.

O exemplo a seguir mostra definida pelo usuário novo operador e Excluir do operador funções projetadas para fazer logon de alocações e Desalocações de memória:

Exemplo

// spec1_the_operator_delete_function1.cpp
// compile with: /EHsc
// arguments: 3
#include <iostream>
using namespace std;

int fLogMemory = 0;      // Perform logging (0=no; nonzero=yes)?
int cBlocksAllocated = 0;  // Count of blocks allocated.

// User-defined operator new.
void *operator new( size_t stAllocateBlock ) {
   static int fInOpNew = 0;   // Guard flag.

   if ( fLogMemory && !fInOpNew ) {
      fInOpNew = 1;
      clog << "Memory block " << ++cBlocksAllocated
          << " allocated for " << stAllocateBlock
          << " bytes\n";
      fInOpNew = 0;
   }
   return malloc( stAllocateBlock );
}

// User-defined operator delete.
void operator delete( void *pvMem ) {
   static int fInOpDelete = 0;   // Guard flag.
   if ( fLogMemory && !fInOpDelete ) {
      fInOpDelete = 1;
      clog << "Memory block " << cBlocksAllocated--
          << " deallocated\n";
      fInOpDelete = 0;
   }

   free( pvMem );
}

int main( int argc, char *argv[] ) {
   fLogMemory = 1;   // Turn logging on
   if( argc > 1 )
      for( int i = 0; i < atoi( argv[1] ); ++i ) {
         char *pMem = new char[10];
         delete[] pMem;
      }
   fLogMemory = 0;  // Turn logging off.
   return cBlocksAllocated;
}

Começando com Visual C++ 5.0, o compilador suporta matriz de membro nova e Excluir operadores em uma declaração de classe.Por exemplo:

// spec1_the_operator_delete_function2.cpp
// compile with: /c
class X  {
public:
   void * operator new[] (size_t) {
      return 0;
   }
   void operator delete[] (void*) {}
};

void f() {
   X *pX = new X[5];
   delete [] pX;
}

Comment

O código anterior pode ser usado para detectar o "vazamento de memória" — ou seja, a memória é alocada no armazenamento livre, mas nunca liberada.Para executar esta detecção, o global nova e Excluir operadores são redefinidos para contagem de alocação e desalocação de memória.

Consulte também

Referência

operador nova função

novo operador (C++)

Excluir operador (C++)