Compartir a través de


función de operador delete

Memoria que se asigna dinámicamente mediante el operador de nuevo se puede liberar mediante el operador de cancelación .El operador delete llama a la función de operador delete , que libera memoria de nuevo el conjunto disponible.Mediante cancelación el operador también produce el destructor de clase (si hay alguno) que se va a llamar.

hay funciones globales y de la clase-scoped de operador delete .Solo una función de operador delete puede definirse para una clase determinada; si se define, oculta la función global de operador delete .La función global de operador delete siempre se denomina para las matrices de cualquier tipo.

La función global de operador delete , si se declara, toma un único argumento de **void ***tipo, que contiene un puntero al objeto para desasignar.El tipo de valor devuelto es void (operador delete no puede devolver un valor).Dos formularios existen para las funciones de operador delete miembro de clase:

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

Solo uno de los dos variantes anteriores puede estar presente para una clase determinada.el primer formulario funciona según lo descrito para operator deleteglobal.El segundo formulario toma dos argumentos, los primeros cuyo es un puntero al bloque de memoria a desasignar y el segundo es el número de bytes a desasignar.El segundo formulario es especialmente útil cuando una función de operador delete de una clase base se utiliza para eliminar un objeto de una clase derivada.

la función de operador delete es estática; por consiguiente, no puede ser virtual.La función de operator delete obedece el control de acceso, como se describe en Control de acceso a miembros.

El ejemplo siguiente se muestra operador nuevo definido por el usuario y las funciones de operador delete diseñadas para registrar asignaciones y bibliotecas del espacio de memoria:

Ejemplo

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

A partir de Visual C++ 5,0, el compilador admite la matriz nuevo miembro y los operadores de cancelación en una declaración de clase.Por ejemplo:

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

El código anterior se puede utilizar para detectar “memoria de salida de memoria” (es decir, que se asigna en el almacén libre pero nunca se libere.Para realizar esta detección, vuelven a definir nuevo y operadores globales de cancelación para contar la asignación y la desasignación de memoria.

Vea también

Referencia

nueva función de operador

operador new (C++)

operador delete (C++)