operator delete funkcji
Pamięć, która jest dynamicznie przydzielane przy użyciu Nowy operator może zostać zwolnione przy użyciu usunąć operatora.Wywołania operator delete usunąć operator funkcji, która zwalnia pamięć z powrotem do puli dostępnych.Za pomocą usunąć operator również powoduje destruktora klasy (jeśli istnieje) ma być wywoływana.
Istnieją globalne i zakresu klasy usunąć operator funkcji.Tylko jeden usunąć operator funkcja może być określony dla danej klasy; Jeśli została zdefiniowana, ukrywa globalnym usunąć operator funkcji.Globalny usunąć operator funkcja zawsze jest wywoływana dla tablic jakiegokolwiek typu.
Globalny usunąć operator funkcji, jeżeli zadeklarowana, pobiera jeden argument typu void *, który zawiera wskaźnik do obiektu, którego przydział należy cofnąć.Zwracany typ jest void (usunąć operator nie może zwracać wartości).Istnieją dwie formy członek klasy usunąć operator funkcje:
void operator delete( void * );
void operator delete( void *, size_t );
Tylko jeden z poprzednim dwa warianty może być obecny dla danej klasy.Pierwszy formularz działa zgodnie z opisem na globalne operator delete.Drugi formularz ma dwa argumenty, z których pierwsze jest wskaźnik do bloku pamięci, którego przydział należy cofnąć, a drugi z nich jest to liczba bajtów, którego przydział należy cofnąć.Drugi formularz, jest szczególnie przydatna, gdy usunąć operator funkcja od klasy podstawowej jest używana do usunięcia obiektu klasy pochodnej.
Usunąć operator funkcja jest statyczny; w związku z tym nie może być wirtualnych.operator delete Funkcji przestrzega kontroli dostępu, jak opisano w Kontroli dostępu Członkowskie.
W poniższym przykładzie pokazano zdefiniowane przez użytkownika operator new i usunąć operator funkcje zaprojektowane do dziennika alokacji i deallocations 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 programu Visual C++ 5.0, kompilator obsługuje tablicy Członkowskie Nowy i usunąć operatorów w deklaracji klasy.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 być zastosowana do wykrywania "wyciek pamięci" — oznacza to, że pamięć jest przydzielona w magazynie wolna, ale nigdy zwolniona.Do wykonania tego wykrywania globalnym Nowy i usunąć operatory są przedefiniować tak, aby liczba alokacji i dezalokacji pamięci.