В автономном контексте (без стандартных библиотек, например, при разработке операционной системы) с использованием g++ возникает следующее явление:
class Base {
public:
virtual ~Base() {}
};
class Derived : public Base {
public:
~Derived() {}
};
int main() {
Derived d;
}
При связывании это говорит примерно следующее: undefined reference to operator delete(void*)
Это явно означает, что g++ генерирует вызовы для удаления оператора, даже если имеется нулевое распределение динамической памяти. Этого не происходит, если деструктор не является виртуальным.
Я подозреваю, что это связано с созданной vtable для класса, но я не совсем уверен. Почему это происходит?
Если я не могу объявить оператор удаления из-за отсутствия динамических программ распределения памяти, существует ли работа?
EDIT1:
Чтобы успешно воспроизвести проблему в g++ 5.1, я использовал:
g++ -ffreestanding -nostdlib foo.cpp