Sdílet prostřednictvím


operator delete – funkce

Paměť, která je dynamicky přidělena pomocí operátoru new lze uvolnit pomocí operátoru delete.Operátor delete zavolá funkci operator delete , která paměť vrátí zpět do fondu dostupné paměti.Použití operátoru delete také způsobuje volání destruktoru třídy (pokud existuje).

Existují funkce operator delete s globálním rozsahem a rozsahem třídy.Pro danou třídu lze definovat pouze jednu funkci operator delete. Pokud je definována, skryje globální funkci operator delete.Globální funkce operator delete je pro pole libovolného typu volána vždy.

Pokud je globální funkce operator delete deklarována, přijímá jediný argument typu void *, který obsahuje ukazatel na objekt, jehož paměť má být uvolněna.Návratový typ je void (funkce operator delete nemůže vrátit hodnotu).Existují dva tvary členské funkce třídy operator delete:

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

Pro danou třídu může být přítomna pouze jedna z předchozích dvou možností.První tvar funguje způsobem popsaným pro globální funkci operator delete.Druhý tvar přijímá dva argumenty, z nichž první je ukazatel na blok paměti, která má být uvolněna, a druhý z nich je počet bajtů, které mají být uvolněny.Druhý tvar je obzvláště užitečný, když funkce operator delete základní třídy slouží k odstranění objektu odvozené třídy.

Funkce operator delete je statická, proto nemůže být virtuální.Funkce operator delete dodržuje řízení přístupu, jak je popsáno v tématu Řízení přístupu ke členům.

Následující příklad ukazuje uživatelsky definované funkce operator new a operator delete,které jsou navrženy tak, aby prováděly protokolování přidělování a uvolňování paměti:

Příklad

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

Počínaje jazykem Visual C++ 5.0 kompilátor podporuje v deklaracích tříd operátory new a delete pro členská pole.Příklad:

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

Komentář

Pomocí předchozího kódu lze zjistit „únik paměti“, to znamená paměť, která je přidělena na volném úložišti, ale není nikdy uvolněna.Aby to bylo možné zjistit, jsou globální operátory new a delete předefinovány, aby počítaly přidělování a uvolňování paměti.

Viz také

Referenční dokumentace

operator new – funkce

new – operátor (C++)

delete – operátor (C++)