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


Функция operator delete

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

Имеются функции operator delete глобального уровня и области видимости класса. Для данного класса можно определить только одну функцию operator delete; если она определена, глобальная функция operator delete скрывается ею. Глобальная функция operator delete всегда вызывается для массивов любого типа.

Глобальная функция operator delete (если она объявлена) принимает один аргумент типа void *, который содержит указатель на освобождаемый объект. Тип возвращаемого значения — void (operator delete не может вернуть значение). Для функций operator delete члена класса предусмотрены две формы:

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

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

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

В следующем примере показаны определенные пользователем функции operator new и operator delete, предназначенные для записи операций выделения и освобождения памяти в журнал.

Пример

// 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, компилятор поддерживает в объявлении класса операторы new и delete массива членов. Например:

// 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 и delete переопределяются для учета выделения и освобождения памяти.

См. также

Ссылки

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

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

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