Программирование на C и C++

Онлайн справочник программиста на C и C++

Перегрузка new u delete

Имеется возможность перегрузить new и delete. Это можно сделать в том случае, если необходи­мо использовать какой-то особый способ выделения памяти. Например, может понадобиться процедура выделения памяти, автоматически использующая дисковый файл в качестве виртуаль­ной памяти в том случае, когда куча оказывается исчерпанной. Какой бы ни была причина, осуществить такую перегрузку очень просто.

Для перегрузки операторов new и delete может использоваться следующий формат:

void *operator new(size_t размер)
{
// выполнение выделения
return указатель_на_память;
}
void operator delete(void *p)
{
// освобождение памяти, на которую указывает р
}

Параметр размер будет содержать число в байтах, которое необходимо выделить для размещения объекта. Это значение будет сформировано автоматически. Перегруженная функция new должна возвращать указатель на выделенную память. За исключением этих ограничений перегруженная функция new может выполнять все, что необходимо.

Функция delete получает указатель на область памяти, которую необходимо освободить. Она обязана освободить эту память. Для перегрузки операторов new и delete применительно к масси­вам надо использовать следующий формат:

void *operator new[](size_t размер)
{
// выполнение выделения
return указатель_на_память;
}
void operator delete[](void *р)
{
// освобождение памяти, на которую указывает р
}

Можно перегрузить операторы new и delete глобально или относительно класса. Для того что­бы перегрузить их по отношению к классу, просто надо сделать их функциями-членами этого класса.