Перегрузка операторов new и delete. Павел Синай — различия между версиями

Материал из SEWiki
Перейти к: навигация, поиск
Строка 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[] производится последовательный вызов деструкторов для всех объектов.

Перегрузка глобальных операторов new и delete

Дополнительные параметры операторов new и delete