Перегрузка операторов new и delete. Павел Синай — различия между версиями
Sinay (обсуждение | вклад) |
Sinay (обсуждение | вклад) |
||
Строка 25: | Строка 25: | ||
В оператор new передается параметр size, указывающий сколько памяти нужно выделить. Это сделано для возможности наследования от нашего класса - наследникам скорее всего понадобится больше памяти, и мы должны ее выделить. | В оператор new передается параметр size, указывающий сколько памяти нужно выделить. Это сделано для возможности наследования от нашего класса - наследникам скорее всего понадобится больше памяти, и мы должны ее выделить. | ||
− | Возвращаемое значение оператора new void*, а не A*, так как на момент его работы объект еще не существует. Конструктор будет вызван только после успешной отработки оператора new. | + | Возвращаемое значение оператора new '''void*''', а не '''A*''', так как на момент его работы объект еще не существует. Конструктор будет вызван только после успешной отработки оператора new. |
+ | |||
+ | Перегрузка операторов для создания и удаления массива объектов производится отдельно: | ||
+ | |||
+ | <source lang="cpp"> | ||
+ | void * operator new[](size_t size) | ||
+ | { | ||
+ | return malloc(size); | ||
+ | } | ||
+ | |||
+ | void operator delete[](void *p) | ||
+ | { | ||
+ | free(p); | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | В оператор new передается размер блока памяти, предназначенного для хранения '''всех''' объектов в массиве. После выполнения оператора new[] производится последовательный вызов конструкторов для объектов из массива. | ||
+ | Перед выполнением оператора delete[] производится последовательный вызов деструкторов для всех объектов. | ||
+ | |||
== Перегрузка глобальных операторов new и delete == | == Перегрузка глобальных операторов new и delete == | ||
== Дополнительные параметры операторов new и delete == | == Дополнительные параметры операторов new и delete == |
Версия 13:53, 30 мая 2011
Содержание
Для чего это нужно
- Организация кэширования памяти.
- Организация сборщика мусора.
- Поиск утечек памяти.
Перегрузка операторов new и delete в классах
Как это делается:
struct A
{
int a;
void * operator new(size_t size)
{
return malloc(size);
}
void operator delete(void *p)
{
free(p);
}
}
В оператор new передается параметр size, указывающий сколько памяти нужно выделить. Это сделано для возможности наследования от нашего класса - наследникам скорее всего понадобится больше памяти, и мы должны ее выделить. Возвращаемое значение оператора new void*, а не A*, так как на момент его работы объект еще не существует. Конструктор будет вызван только после успешной отработки оператора new.
Перегрузка операторов для создания и удаления массива объектов производится отдельно:
void * operator new[](size_t size)
{
return malloc(size);
}
void operator delete[](void *p)
{
free(p);
}
В оператор new передается размер блока памяти, предназначенного для хранения всех объектов в массиве. После выполнения оператора new[] производится последовательный вызов конструкторов для объектов из массива. Перед выполнением оператора delete[] производится последовательный вызов деструкторов для всех объектов.