删除void指针时不调用析构函数

EOG*_*EOG 2 c++ containers pointers destruction

我有3节课

class A
{
    A();
    virtual ~A();
}
class B : public A
{
    B();
    ~B();
}
class C
{
    void *obj;
    C() : obj(nullptr) {}
    ~C() { if (obj) delete obj; }
}
Run Code Online (Sandbox Code Playgroud)

当我使用class C作为类的任何子类的容器A并尝试删除C实例时.A,B析构函数是不是很正常?什么是solutuon?

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

Mik*_*our 12

删除指向不兼容类型(包括void)的指针会给出未定义的行为.

解决办法是什么?

  • 使用正确的类型:您指定的类型new,或者如果它具有虚拟析构函数的基类; 要么
  • 使用std::shared_ptr<void>,初始化std::shared_ptr<correct_type>:它的删除器会做正确的事情.

在这种情况下,看起来你可以简单地存储A*而不是void*,因为你说它应该是"任何类的孩子的容器A".

顺便说一下,在删除指针之前无需检查指针是否为空.

  • `shared_ptr <void>`的+1.非常好.(也可以从`unique_ptr <T>`初始化.) (3认同)

Geo*_*roy 6

你删除了一个void*,所以delete不知道它是一个B*无法调用的析构函数.如果希望在删除时调用析构函数,则必须使用类指针.

例如,所有可能是C的类都obj扩展为A,然后使用A*.