Udostępnij za pośrednictwem


usuwanie operatora — funkcja

Pamięć, która jest przydzielana dynamicznie przy użyciu operatora new może zostać zwolniona przy użyciu operatora delete.Operator "delete" wywołuje funkcję operator delete, która zwalnia pamięć z powrotem do puli dostępnej pamięci.Użycie operatora delete powoduje również wywołanie destruktora klasy (jeśli istnieje).

Istnieją funkcje operator delete o zakresie globalnym oraz o zakresie klasy.Dla danej klasy może zostać zdefiniowana tylko jedna funkcja operator delete; jeśli została zdefiniowana, to ukrywa globalną funkcję operator delete.Globalna funkcja operator delete jest zawsze wywoływana dla tablic dowolnego typu.

Globalna funkcja operator delete (jeśli została zadeklarowana), przyjmuje pojedynczy argument typu void *, który zawiera wskaźnik do obiektu, którego pamięć ma zostać zwolniona.Zwracanym typem jest void (operator delete nie może zwracać wartości).Istnieją dwie postacie funkcji członkowskich klasy operator delete:

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

Tylko jeden z dwóch powyższych wariantów może być obecny w danej klasie.Pierwsza postać działa w sposób opisany dla globalnej funkcji operator delete.Druga postać przyjmuje dwa argumenty, z których pierwszy jest wskaźnikiem do bloku pamięci, który ma być zwolniony, a drugi jest liczbą zwalnianych bajtów.Druga postać jest szczególnie użyteczna, gdy funkcja operator delete w klasie podstawowej jest używana do usuwania obiektu klasy pochodnej.

Funkcja operator delete jest statyczna; z tego powodu nie może być wirtualna.Funkcja operator delete przestrzega kontroli dostępu, zgodnie z opisem w Kontrola dostępu do elementów członkowskich.

Następujący przykład pokazuje zdefiniowane przez użytkownika funkcje operator new i operator delete przeznaczone do rejestrowania przydziału i zwalniania pamięci:

Przykład

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

Począwszy od języka Visual C++ 5.0, kompilator obsługuje w deklaracjach klasy operatory tablic członkowskich new i delete.Na przykład:

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

Komentarz

Powyższy kod może zostać użyty do wykrywania "wycieków pamięci" – oznacza to pamięć, która została przydzielona w nigdy niezwolnionym obszarze.Aby je wykryć, globalne operatory new i delete muszą zostać zdefiniowane ponownie, aby zliczać alokacje i zwolnienia pamięci.

Zobacz też

Informacje

Funkcja operatora new

new — Operator (C++)

delete — Operator (C++)