c++pointerscontainersdestruction

Destructor not invoked when deleting void pointer


I've got 3 classes

class A
{
    A();
    virtual ~A();
}
class B : public A
{
    B();
    ~B();
}
class C
{
    void *obj;
    C() : obj(nullptr) {}
    ~C() { if (obj) delete obj; }
}

when I use class C as a container for any child of class A and try to delete C instance. A, B destructor is not inveked is it normal? What is the solutuon?

C* instance = new C();
instance.obj = new B();
//Magic
delete instance; // A and B destructor is not called

Solution

  • Deleting a pointer to an incompatible type (including void) gives undefined behaviour.

    What is the solution?

    In this case, it looks like you can simply store A* rather than void*, since you say it should be "a container for any child of class A".

    By the way, there's no need to check whether the pointer is null before deleting it.