funzione operator delete

Memoria allocata in modo dinamico utilizzando il nuovo l'operatore può essere liberato tramite eliminazione operatore.l'operatore delete chiama operator delete funzione, che libera la memoria del pool disponibile.Utilizzo di eliminazione l'operatore anche nel distruttore della classe (se c " è uno) a essere chiamato.

È globale e classe-scoped operator delete funzioni.Solo uno operator delete la funzione può essere definita per una determinata classe; se definita, nascondere il globale operator delete funzione.il globale operator delete la funzione viene chiamata sempre per le matrici di qualsiasi tipo.

il globale operator delete la funzione, se dichiarata, accetta un solo argomento di tipo void *, che contiene un puntatore all'oggetto per rilasciare.il tipo restituito è void (operator delete non può restituire un valore.Due form che il membro della classe operator delete funzioni:

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

Solo una delle due varianti precedenti può essere presente per una determinata classe.Funzionamento del primo form come descritti per globale operator delete.Il secondo form accetta due argomenti, il primo dei quali è un puntatore al blocco di memoria da rilasciare e il secondo di cui è il numero di byte da rilasciare.il secondo form è particolarmente utile quando operator delete la funzione da una classe base viene utilizzata per eliminare un oggetto di una classe derivata.

operator delete la funzione è statica; pertanto, non può essere virtuale.operator delete la funzione obbedisce al controllo di accesso, come descritto in Controllo di accesso al membro.

Nell'esempio seguente viene illustrato definito dall'utente operatore new e operator delete funzioni progettate per registrare le allocazioni ed eliminazione dell'assegnazione della memoria:

Esempio

// 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;
}

A partire da Visual C++ 5,0, il compilatore supporta la matrice del membro nuovo e eliminazione operatori in una dichiarazione di classe.Di seguito è riportato un esempio:

// 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;
}

Commento

Il codice precedente può essere utilizzato per rilevamento della memoria delle perdite di memoria„, ovvero allocata riguardanti l'archivio libero ma non viene mai liberata.Per eseguire questo rilevamento, il globale nuovo e eliminazione gli operatori vengono ridefiniti per contare l'allocazione e la deallocazione di memoria.

Vedere anche

Riferimenti

nuova funzione operatore

operatore new (C++)

operatore delete (C++)