Freigeben über


Operator-Funktion

Arbeitsspeicher, der mithilfe des Operators neu dynamisch zugeordnet ist, kann mithilfe des delet-Operators freigegeben werden.Der Operator delete ruft die Operator delete Funktion an, die an den Pool verfügbaren Arbeitsspeicher freigibt.Verwenden des delet-Operators wird auch der Klassendestruktor (falls vorhanden), aufgerufen werden.

Es gibt Klasse-bewertete und globale Funktionen Operator delete .Nur eine Operator delete Funktion kann für die angegebene Klasse definiert werden. sofern definiert wird, blendet ihn die globale Operator delete Funktion aus.Die globale Operator delete Funktion wird immer für Arrays beliebigen Typs aufgerufen.

Die globale Operator delete Funktion, wenn er deklariert wurde, erhält ein einzelnes Argument vom Typ void *, der einen Zeiger auf das Objekt, das freigegeben werden sollen.Der Rückgabetyp ist void (Operator delete kann keinen Wert zurückgeben).Es gibt zwei Formen sind für Klassenmember Operator delete Funktionen:

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

Nur einer der vorherigen zwei Varianten kann für einen angegebenen Klasse vorhanden sein.Die ersten Schalungen, z. B. für globales operator deletebeschrieben.Die zweite Form verwendet zwei Argumente, das erste Argument ein Zeiger auf den Speicherblock freizugeben ist, und das zweite Argument ist die Anzahl von Bytes freizugeben.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. deshalb kann sie nicht virtuell sein.Die operator delete-Funktion entspricht Zugriffssteuerung, wie in Member-ACCESS-Steuerelementbeschrieben.

Im folgenden Beispiel wird eine benutzerdefinierte Operator neu und Operator delete Funktionen an, die auf die Protokoll von Namespacezuordnungen und Freigabe von Arbeitsspeicher geeignet sind:

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 Member array neu und delet-Operatoren in einer Klassendeklaration.Beispiele:

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

Der vorhergehende Code kann verwendet werden, um „Arbeitsspeicher“ durchsickern h. zu erkennen, Arbeitsspeicher, der zugeordnet wird, auf dem freien Speicher jedoch nicht freigegeben.Um diese Erkennung auszuführen, werden globale neu und neu definiert delet-Operatoren und Freigabe von Arbeitsspeicher für die Zuordnung zu zählen.

Siehe auch

Referenz

operator new-Funktion

new-Operator (C++)

delete-Operator (C++)