ProgrammatieC++ ontwikkelaar

Wat is een virtuele destructor in C++ en waarvoor wordt deze gebruikt? Geef een voorbeeld van incorrect gedrag bij afwezigheid van een virtuele destructor.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Een virtuele destructor is een destructor die is gedeclareerd met het sleutelwoord virtual in de basis klasse. Dit garandeert de oproep van de destructor van de afgeleide klasse bij het verwijderen van een object via een pointer naar de basis klasse.

class Base { public: virtual ~Base() { /* ... */ } }; class Derived : public Base { public: ~Derived() override { /* ... */ } }; Base* ptr = new Derived(); delete ptr; // Beide destructors worden aangeroepen

Zonder een virtuele destructor kan het gedrag incorrect zijn — de destructor van de afgeleide klasse wordt niet aangeroepen, wat leidt tot geheugenlekken!


Vraag met een valstrik.

Moet je een destructor als virtueel declareren als er geen enkele virtuele functie in je basis klasse is?

Antwoord: Ja, als er van de klasse wordt overgeërfd met verwijdering via een pointer naar het basistype. Zelfs als er geen andere virtuele functies zijn, is de virtualiteit van de destructor noodzakelijk voor correcte verwijdering van afgeleiden.

class Shape { public: virtual ~Shape() {} };

Voorbeelden van echte fouten door ongekendheid met de nuance van het onderwerp.


Verhaal 1

In een groot project van een grafische bibliotheek kwamen OpenGL-resources (buffers, texturen) vrij bij het verwijderen van teken-objecten via een pointer naar de basis klasse — de bijbehorende vrijgaven bevonden zich in de destructors van de afgeleide klassen, maar deze werden niet aangeroepen.


Verhaal 2

In een netwerkbibliotheek voor het TCP-protocol was de destructor van de afgeleiden, beheerd via een gemeenschappelijk basisinterface, niet aangeroepen bij het verwijderen van sessies. Dit leidde tot massale vastlopes van sockets en uitputting van de descriptorlimieten.


Verhaal 3

In een embedded-systeem op C++ veroorzaakte een verkeerd gedeclareerde (niet-virtual) destructor van de basis klasse geheugenlekken voor systeemresources van invoerapparaten, de apparaten vielen uit na enkele cycles van driver-updates.