Quand utiliser les destructeurs virtuels en C++ et que se passe-t-il si on ne les déclare pas ?
Bonjour à tous ! Je viens de commencer à étudier le C++ et je n'arrive pas à comprendre une chose. Regardez :
J'ai une classe de base `Base` et une classe héritée `Derived`. Dans `Derived`, j'alloue de la mémoire sur le tas. Quand je crée un objet via un pointeur vers la classe de base et que je le supprime ensuite avec `delete`, seul le destructeur de `Base` est appelé, mais pas celui de `Derived`. Cela entraîne une fuite de mémoire, car la mémoire allouée dans la classe dérivée n'est pas libérée.
Je sais qu'il faut ajouter `virtual` devant le destructeur dans la classe de base, et alors tout fonctionne. Mais pourquoi cela se produit-il ? Pourtant, j'ai explicitement écrit le code qui devrait appeler le destructeur de la classe dérivée ? Ou est-ce que je confonds quelque chose ?
Voici un exemple de code qui ne fonctionne pas chez moi (enfin, il fonctionne, mais avec une fuite) :
```cpp
class Base {
public:
~Base() { std::cout << "Base destructor\n"; }
};
class Derived : public Base {
private:
int* data;
public:
Derived() { data = new int[100]; }
~Derived() {
delete[] data;
std::cou