operator delete
уникален тем, что является функцией, не являющейся членом или статической, которая отправляется динамически.Тип с виртуальным деструктором выполняет вызов своего собственного delete
из самого производного деструктора.
struct abc {
virtual ~abc() = 0;
};
struct d : abc {
operator delete() { std::cout << "goodbye\n"; }
};
int main() {
abc *p = new d;
delete p;
}
( Запустите этот пример .)
Для этогочтобы работать с удалением размещения, деструктор должен каким-то образом передать дополнительные аргументы operator delete
.
- Решение 1: Передать аргументы через виртуальную функцию.Для этого требуется отдельный виртуальный деструктор для каждого статического члена и глобальная перегрузка
operator delete
с различными аргументами. - Решение 2: Пусть виртуальный деструктор возвращает указатель на функцию для вызывающей стороны, указывающую, что
operator delete
должен быть назван.Но если деструктор выполняет поиск, это сталкивается с той же проблемой, связанной с требованием нескольких определений виртуальных функций, что и # 1.Должен быть создан некоторый набор абстрактных перегрузок, который разрешит вызывающая сторона.
У вас есть отличная точка зрения, и это было бы хорошим дополнением к языку.Теоретически, возможно, вписать его в существующую семантику delete
.Но большую часть времени мы не используем полную функциональность delete
, и достаточно использовать вызов псевдодеструктора, за которым следует что-то вроде arena.release(p)
.