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 шт):

Автор решения: Harry

Элементами вашего 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);

См. https://ideone.com/9kSO0J

→ Ссылка