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".
顺便说一下,在删除指针之前无需检查指针是否为空.
你删除了一个void*,所以delete不知道它是一个B*无法调用的析构函数.如果希望在删除时调用析构函数,则必须使用类指针.
例如,所有可能是C的类都obj扩展为A,然后使用A*.