Freigeben über


operator delete-Funktion

Arbeitsspeicher, der mithilfe des new-Operators dynamisch zugeordnet wird, kann mithilfe des delete-Operators freigegeben werden. Der delete-Operator ruft die Funktion Operator delete auf, die Speicherplatz für den verfügbaren Pool frei macht. Durch die Verwendung des delete-Operators wird auch der Klassendestruktor (falls vorhanden) aufgerufen.

Es gibt globale und klassenspezifische operator delete -Funktionen. Es kann nur eine operator delete-Funktion für eine angegebene Klasse definiert werden. Sofern definiert, blendet sie die globale operator delete-Funktion aus. Die globale operator delete-Funktion wird immer für Arrays jeglichen Typs aufgerufen.

Sofern deklariert, verwendet die globale operator delete-Funktion ein einzelnes Argument vom Typ void *, das einen Zeiger auf das Objekt enthält, dessen Zuordnung aufgehoben werden soll. Der Rückgabetyp ist void (Operator delete kann keinen Wert zurückgeben). Es gibt zwei Formen für operator delete-Funktionen von Klassenmembern:

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

Nur eine der vorherigen beiden Varianten kann für eine angegebene Klasse vorhanden sein. Die erste Form funktioniert wie beschrieben für globale operator delete. Die zweite Form verwendet zwei Argumente, das erste Argument ist ein Zeiger auf den freizugebenden Speicherblock und das zweite Argument ist die Anzahl der freizugebenden Bytes. Die zweite Form ist besonders nützlich, wenn eine Operator delete-Funktion aus einer Basisklasse verwendet wird, um ein Objekt einer abgeleiteten Klasse zu löschen.

Die Operator delete-Funktion ist statisch und kann daher nicht virtuell sein. Die operator delete-Funktion folgt der Zugriffssteuerung wie unter Memberzugriffssteuerung beschrieben.

Das folgende Beispiel zeigt die benutzerdefinierten Funktionen operator new und operator delete, die dazu dienen, Speicherzuordnungen und Aufhebungen von Speicherzuordnungen zu protokollieren:

Beispiel

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

Ab Visual C++ 5.0, unterstützt der Compiler Memberarray-new- und delete-Operatoren in einer Klassendeklaration. Beispiel:

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

Kommentar

Mit dem vorangehenden Code kann "Arbeitsspeicherverlust" erkannt werden, also Arbeitsspeicher, der im freien Speicher zugeordnet, jedoch nicht freigegeben wurde. Um diese Erkennung auszuführen, werden die globalen Operatoren new und delete neu definiert, um die Speicherbelegung und die Freigabe der Speicherbelegung zu zählen.

Siehe auch

Referenz

operator new-Funktion

new-Operator (C++)

delete-Operator (C++)