у меня 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
. - person Shahbaz   schedule 03.10.2013C
в качестве контейнера для любого потомка классаA
, почему вы не можете использоватьA *
для типаobj
? - person CB Bailey   schedule 03.10.2013void*
не является неправильным; просто неопределенное поведение, если оно не равно нулю. Мой (достаточно реальный) компилятор просто выдает предупреждение. - person Mike Seymour   schedule 03.10.2013delete nullptr
. - person Kerrek SB   schedule 03.10.2013