Оператор новый и удалить область перегрузки
Я наткнулся на некоторые вопросы о связывании и перегрузке операторов new и delete.
Как далеко действует глобальная перегрузка оператора new/delete?
- За единицу перевода
- Для каждого связанного приложения с хотя бы одним объектным файлом, перегружающим эти операторы
А как насчет динамической связи?
Могут ли быть несколько определений этих операторов? Если какой взят.
1 ответ
Глобальные функции распределения и освобождения предназначены для всего приложения, а не для каждой единицы перевода. Поскольку они глобальны, не может быть нескольких определений, кроме как в той степени, в которой вы считаете new
, new[]
и бесконечное количество возможных мест размещения new
быть "множественными определениями". В частности, к сожалению, не существует переносимого способа вызова исходной функции глобального распределения, когда вы определяете свою собственную.
Однако вы можете определить специфичные для класса функции распределения и освобождения.
Если вы хотите избежать выбора специфичной для класса функции распределения в new
-выражение вы можете использовать ::
префикс, т.е. запись ::new T
и это хорошая идея для вызова размещения стандартной библиотеки new
,
Относительно "Как насчет динамической связи?" непонятно что ты имеешь ввиду. В C++ есть статическая связь, внешняя связь и нет связи, но нет динамической связи. Возможно, вы имеете в виду динамические библиотеки (например, Windows DLL), и это довольно сложная проблема. Стандарт C++ не имеет прямой поддержки динамических библиотек. Один из способов обеспечения безопасности на практике - это не предоставлять собственное глобальное распределение / освобождение, а динамически связывать все (в Windows это означает использование динамически связанной библиотеки времени выполнения).