Министерство высшего и среднего специального образования республики узбекистана


Download 164.64 Kb.
bet5/5
Sana25.02.2023
Hajmi164.64 Kb.
#1231224
1   2   3   4   5
Bog'liq
ООП

Оператор delete
Память, которая динамически выделяется с помощью new оператора, можно освободить с помощью delete оператора. Оператор удаления вызывает функцию operator delete , которая освобождает память обратно в доступный пул. delete Использование оператора также вызывает деструктор класса (если таковой существует).
Существуют глобальные функции и функции с областью operator delete действия класса. Для заданного класса можно определить только одну operator delete функцию; если она определена, она скрывает глобальную operator delete функцию. Глобальная operator delete функция всегда вызывается для массивов любого типа.
Глобальная operator delete функция. Для глобальных operator delete функций и функций-членов operator delete класса существуют две формы:
void operator delete( void * );
void operator delete( void *, size_t );
Для данного класса может присутствовать только одна из предыдущих двух форм. Первая форма принимает один аргумент типа void *, который содержит указатель на объект для освобождения. Вторая форма, освобождение размера, принимает два аргумента: первый — указатель на блок памяти для освобождения, а второй — количество байтов для освобождения. Тип возвращаемого значения обеих форм ( voidoperator delete не может возвращать значение).
Цель второй формы — ускорить поиск правильной категории размера удаляемого объекта. Эти сведения часто не хранятся рядом с самим выделением и, скорее всего, некэшируются. Вторая форма полезна, если operator delete функция из базового класса используется для удаления объекта производного класса.
Функция operator delete является статической, поэтому она не может быть виртуальной.
В следующем примере показаны определяемые operator new пользователем функции и operator delete функции, предназначенные для регистрации выделения и освобождения памяти:
#include
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 );
}
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;}
Приведенный выше код можно использовать для обнаружения "утечки памяти", то есть памяти, выделенной в свободном хранилище, но никогда не освобождаемой. Для обнаружения утечек глобальные new и delete операторы переопределяются для подсчета выделения и освобождения памяти.

Download 164.64 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling