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.