Каковы ограничения перегрузки, переопределения и замены нового / удаления? - PullRequest
4 голосов
/ 06 января 2012

Я понимаю, что есть 3 общих способа для изменения поведения новых и удаления в C ++:

  • Замена по умолчанию для новых / удаления иnew [] / delete []
  • Переопределение или перегрузка версий размещения (переопределение той, в которую передана ячейка памяти, перегрузка при создании версий, которые передают другиетипы или числа аргументов)
  • Перегрузка версии, специфичные для класса.

Каковы ограничения для выполнения этих модификаций в поведении new / delete?

В частности, существуют ли ограничения на сигнатуры, с которыми могут использоваться новые и удаляемые?

Имеет смысл, если какие-либо замещающие версии должны иметь одинаковую подпись (в противном случае они не будут заменой или сломаютсядругой код (например, STL, например), но допустимо ли, чтобы глобальное размещение или специфичные для класса версии возвращали умные указатели или некоторый пользовательский дескриптор для экзамена?PLE?

Ответы [ 2 ]

3 голосов
/ 06 января 2012

Прежде всего, не путайте выражение new / delete с функцией operator new() .

Выражение является языковой конструкцией, которая выполняет конструирование и уничтожение. Оператор - это обычная функция, которая выполняет выделение памяти (де).

Только выражения по умолчанию (operator new(size_t) и operator delete(void *) могут использоваться с выражениями по умолчанию new и delete. Все остальные формы в общем называются формами "размещения", а для тех, которые вы можете использовать только new, но вы должны уничтожать объекты вручную, вызывая деструктор. Формы размещения имеют довольно ограниченную и специализированную потребность. Безусловно, наиболее полезной формой размещения является глобальное размещение-новое, ::new (addr) T, но поведение этого изменить нельзя. (вероятно, поэтому он единственный популярный).

Все new операторы должны возвращать void *. Эти функции распределения являются гораздо более низкоуровневыми, чем вы могли бы оценить, поэтому в основном вы «будете знать, когда вам нужно связываться с ними».

Повторим: C ++ разделяет понятия построения объекта и выделения памяти. Все, что вы можете сделать, это предоставить альтернативные реализации для последнего.

0 голосов
/ 06 января 2012

Когда вы перегружаете new и удаляете внутри класса, вы эффективно изменяете способ выделения и освобождения памяти для класса, прося предоставить вам этот элемент управления.

Это может быть сделано, когда классхочет использовать какой-то пул для выделения своих экземпляров, либо для оптимизации, либо для целей отслеживания.

Ограничения, как и при значительной перегрузке любого оператора, - это список параметров, который вы можете передать, и ожидаемое поведениепридерживаться.

...