fonction d'opérateur DELETE
La mémoire qui est allouée dynamiquement à l'aide de l'opérateur nouveau peut être libérée avec l'opérateur de suppression .L'opérateur delete appelle la fonction d' operator delete , qui libère la mémoire dans le pool disponible.À l'aide de l'opérateur suppression entraîne également le destructeur de classe (le cas échéant) à appeler.
Il existe des fonctions globales et de classe-scoped d' operator delete .Seule une fonction d' operator delete peut être définie pour une classe donnée ; si elle est définie, elle masque la fonction globale d' operator delete .La fonction globale d' operator delete est toujours appelée pour les tableaux de tous types.
La fonction globale d' operator delete , si déclarée, prend un argument unique du type void *, qui contient un pointeur vers l'objet pour libérer.Le type de retour est void (operator delete ne peut pas retourner une valeur).Deux formulaires existent pour les fonctions d' operator delete de membre de classe :
void operator delete( void * );
void operator delete( void *, size_t );
Seule l'une des deux variantes précédentes peut être présent pour une classe donnée.Le premier formulaire s'exécute comme indiqué pour operator deleteglobal.Le deuxième formulaire prend deux arguments, le premier étant un pointeur vers le bloc de mémoire à libérer et le second étant le nombre d'octets à libérer.Le deuxième formulaire est particulièrement utile lorsqu'une fonction d' operator delete d'une classe de base est utilisée pour supprimer un objet d'une classe dérivée.
la fonction d' operator delete est statique ; par conséquent, elle ne peut pas être virtuelle.la fonction d' operator delete obéit le contrôle d'accès, comme décrit dans Contrôle d'accès de membre.
L'exemple suivant montre operator new défini par l'utilisateur et des fonctions d' operator delete conçues des allocations de journal et aux désallocations de la mémoire :
Exemple
// 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;
}
À partir de Visual C++ 5,0, le tableau membre nouveau en charge le compilateur et les opérateurs de suppression dans une déclaration de classe.Par exemple :
// 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;
}
Commentaire
Le code précédent peut être utilisé pour détecter la mémoire « des fuites de mémoire » - c. autrement dit., qui est allouée sur le magasin libre mais jamais désallouée.Pour exécuter cette détection, nouveau et des opérateurs globaux de suppression sont redéfinis pour compter l'allocation et la libération de la mémoire.