In un contesto indipendente (senza librerie standard, ad esempio in fase di sviluppo del sistema operativo) usando g ++ il seguente fenomeno si verifica:Perché operatore delete richiesto per distruttori virtuali
class Base {
public:
virtual ~Base() {}
};
class Derived : public Base {
public:
~Derived() {}
};
int main() {
Derived d;
}
Quando si collega afferma qualcosa di simile: undefined reference to operator delete(void*)
Ciò significa chiaramente che g ++ sta generando chiamate per eliminare l'operatore anche se non ci sono allocazioni di memoria dinamica zero. Questo non succede se il distruttore non è virtuale.
Sospetto che questo abbia a che fare con il vtable generato per la classe, ma non ne sono del tutto sicuro. Perché succede?
Se non è necessario dichiarare un operatore di cancellazione a causa della mancanza di routine di allocazione dinamica della memoria, c'è un problema?
Edit1:
di riprodurre con successo il problema in g ++ 5.1 che ho usato:
g ++ -ffreestanding -nostdlib foo.cpp
Non riesco a riprodurre il problema per questo semplice esempio. Sei sicuro di non mancare qualcosa? –
@RobinKrahl hai provato ad aggiungere -ffreestanding alla riga di comando g ++. Controllare il dump dello smontaggio se ci sono delle chiamate per eliminare l'operatore. – felknight
Compila usando g ++ 4.8.4 sul mio Linux Mint. Usato 'g ++ Testing.cpp -ffreestanding'. Ma con clang 3.5.0 ho un sacco di errori di linker. – ChajusSaib