C++ Удаление объектов из массива указателей с помощью delete []
Всем привет! У меня есть массив указателей на виртуальный базовый класс, каждый из них в массиве указывает на какой-то его наследник, у которого собственно есть свой деструктор. Если я использую delete [] для указателя на указатели(т.е. банально на этот массив), то сработают ли как нужно деструкторы наследников класса? Или только деструкторы, унаследованные от базового? Вот что я имел в виду:
struct A
{
int a;
virtual ~A()
{
do some tasks....
}
}
struct B
{
int b;
~B()
{
do some other things...
}
}
//ну и пусть еще будет какой-то еще класс С ,который просто наследует А
int main()
{
B* myB=new B;
C* myC=new C;
A** array=new A*[2];
array[0]=myB;
array[1]=myC;
delete [] array;
return 0;
}
Сработает ли такое? И второй вопрос, можно ли как-то без такого массива указателей обойтись? Чтобы вообще не было указателя A**, а просто был А* с возможностью записать любой производный класс в его ячейку?
Ответы (1 шт):
Элементами вашего array являются просто указатели:
A** array=new A*[2];
delete [] array;
а для них никакие деструкторы не предусмотрены.
Грубо говоря, уничтожая указатель, вы не уничтожаете то, на что он указывает. Так что никакие деструкторы не будут вызваны вообще.
И это правильно :) — сами подумайте, что было бы, если бы вы были правы, а код был бы
A* myB=new A;
A a;
A* myC=&a;
A** array=new A*[2];
array[0]=myB;
array[1]=myC;
delete [] array;
Что до
Чтобы вообще не было указателя A**, а просто был А* с возможностью записать любой производный класс в его ячейку?
то вопрос не очень понятен... Вас интересует это?
A* a = new B;
Update
как сделать массив из множества разнообразных наследников таким образом? И чтоб не было проблем с деструктором для каждого?
Вариант с массивом и ручной работой :)
A** array=new A*[3];
array[0] = new B;
array[1] = new C;
array[2] = new A;
for(int i = 0; i < 3; ++i)
delete array[i];
delete [] array;
Вариант С++'ный:
vector<unique_ptr<A>> array;
array.emplace_back(new B);
array.emplace_back(new C);
array.emplace_back(new A);