Sdílet prostřednictvím


Funkce operátor delete

Paměť přidělená dynamicky pomocí nové operátor lze uvolnit pomocí Odstranit operátor.Volání operátor delete operátor delete funkci, která uvolní paměť zpět do fondu k dispozici.Použití Odstranit operátor také způsobuje destruktoru třídy (pokud existuje) pro volání.

Jsou globální a rozsahem třídy operátor delete funkcí.Pouze jeden operátor delete funkce může být definován pro dané třídy; Pokud je definována, skryje globální operátor delete funkce.Globální operátor delete funkce se nazývá vždy pro každý typ pole.

Globální operátor delete funkci, pokud je deklarována, převezme jediný argument typu void *, která obsahuje ukazatel na objekt, které má být navráceno.Návratový typ je void (operátor delete nemůže vrátit hodnotu).Existují dvě formy pro člen třídy operátor delete funkcí:

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

Pro danou třídu, může být pouze jedna ze předchozí dvě varianty.První formulář pracuje podle popisu pro globální operator delete.Druhý formulář má dva argumenty, z nichž první je ukazatel na blok paměti, která má být navrácena, a druhé je počet bajtů, které má být navráceno.Druhý formulář je zvláště užitečné, když operátor delete funkce ze základní třídy slouží k odstranění objektu odvozené třídy.

Operátor delete je funkce statické; proto nemůže být virtuální.operator delete Funkce obeys řízení přístupu, jak je popsáno v Řízení přístupu členských.

Následující příklad ukazuje uživatelem definované nový operátor a operátor delete funkcí, které jsou navrženy tak, aby protokol přidělení a deallocations 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 Visual C++ 5.0, kompilátor podporuje pole členské nové a Odstranit operátory v deklaraci třídy.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;
}

Comment (Komentář)

Předcházející kód lze použít ke zjištění "únik paměti" –, paměti, která je přidělena na volného obchodu, ale uvolněna.K provedení tohoto zjišťování globální nové a Odstranit operátory jsou předefinovány počet přidělování a navracení zpět paměti.

Viz také

Referenční dokumentace

operátor nové funkce

nový operátor (C++)

Odstraňte operátor (C++)