【发布时间】:2013-10-10 02:52:13
【问题描述】:
我有 3 节课
class A
{
A();
virtual ~A();
}
class B : public A
{
B();
~B();
}
class C
{
void *obj;
C() : obj(nullptr) {}
~C() { if (obj) delete obj; }
}
当我使用 C 类作为 A 类的任何子类的容器并尝试删除 C 实例时。 A, B 没有调用析构函数是正常的吗?解决办法是什么?
C* instance = new C();
instance.obj = new B();
//Magic
delete instance; // A and B destructor is not called
【问题讨论】:
-
delete非常具有类型意识。如果你delete和void *它不会知道该对象最初是C。 -
如果您使用
C作为“A类的任何孩子”的容器,为什么不能将A *用于obj的类型? -
你can't delete a void pointer。它不是有效的 C++,甚至不应该编译。如果是这样,则说明您没有使用真正的 C++ 编译器,并且此问题没有适当标记。
-
@KerrekSB:删除
void*并没有错;如果它不为空,则只是未定义的行为。我的(合理的“真实”)编译器只是发出警告。 -
@MikeSeymour:是的,这样更好。但这是你真的不能忽视的警告之一。可以说,它也是标准中的一些遗留问题。如果唯一允许的值是 NULL,为什么还要允许 void 指针?还不如报废整件事。你仍然可以允许
delete nullptr。
标签: c++ pointers containers destruction