Поделиться через


функция удаления оператора

Память, которая динамически выделяется использование создать оператор может освободить использование удалить оператор.Оператор delete вызывает Оператор delete функция, которая освобождает память обратно в пул со специальными возможностями.Использование удалить оператор также вызывает деструктор класса (если он имеется), то непосредственного вызова.

Глобально и классы-scoped Оператор delete функции.Только одно Оператор delete функции могут быть указаны для данного класса. если этот параметр задан, он скрывает global Оператор delete функция.Global Оператор delete функция всегда вызывается для массивов любого типа.

Global Оператор delete функция, если объявлено, принимает один аргумент типа void *, который содержит указатель на объект для отмены распределению.Тип возвращаемых данных void (Оператор delete невозможно вернуть значение).2 Существуют для члена класса формы Оператор delete функции:

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

Только один из приведенных выше 2 вариантов может присутствовать для данного класса.Первая форма работает как описано для глобального operator delete.Вторая форма принимает 2 первого аргумента, что указатель на блок памяти для отмены распределению и второму, что число байтов для отмены распределению.Вторая форма особенно полезна в случаях, когда Оператор delete функция от базового класса используется для удаления объекта производного класса.

Оператор delete функция является статическим; поэтому она не может быть виртуальной.operator delete функция повинуется элементу управления доступом, как описано в разделе Управление доступом к членам.

В следующем примере показан определяемый пользователем оператор new и Оператор delete функции конструировали заносить в журнал распространения и deallocations памяти:

Пример

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

Начиная с Visual C++ 5,0, компилятор поддерживает массив элементов создать и удалить операторы в объявлении класса.Примеры.

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

Комментарий

Предыдущий код может использовать для обнаружения утечек памяти "память", то есть, выбранной в свободном хранилище, но никогда не освобождается.Чтобы выполнить это обнаружение глобальный создать и удалить операторы переопределен для подсчета выделение и освобождение памяти.

См. также

Ссылки

функция оператора new

оператор new (C++)

оператор delete (C++)