Олександр Ковальчук написав:Доброго дня.
Діло в тому що в подальшому можна написати слідуюче:
MyClassArr marr(6);
baseAbstract * mclass = _arr.getMyClass(3);
delete mclass;
В останньому рядку було видалено елемент масиву.... а клас MyClassArr про це навіть не "здогадується"....
Це не так. Він не є елементом масиву.
По-перше, baseAbstract * mclass - буде створено у СТЕКУ.
По-друге, baseAbstract * mclass = marr.getMyClass(3); присвоїть цій ділянці пам'яті адресу із КУПИ. В даному випадку 4-го (4-1=3) елементу масиву вказівників - marr. Аж ніяк не буде навпаки.
class Myclass : public baseAbstract {}
class MyClassArr
{
public:
MyClassArr(int size):size(size)
{
arr = new MyClass*[size]{}; // тут потрібно виділяти пам'ять не під похідні елементи класу, а базові (baseAbstract)
}
Ви не вірно звільняєте пам'ять.
Створюєте масив вказівників "Базового класу"
arr = new MyClass*[size]{};
А Видаляєте елементи, котрих ще навіть і не існує.
for(int i = 0;i < size;i++) delete arr[i];
Нагадаю. Масиви видаляються
, під-масиви або елементи масиву -
delete [] arr[i];
delete arr[i]
.
Зразок коду, як потрібно працювати із розподілом пам'яті для Вашого завдання.
#include <iostream>
using namespace std;
class Base { /* ... */ };
class Derived_1 : public Base { /* ... */ };
class Derived_2 : public Base { /* ... */ };
class Derived_3 : public Base { /* ... */ };
class Array
{
public:
~Array()
{
/* ... */
for (size_t i = 0; i < s; ++i)
if (p[i])
delete[] p[i], p[i] = nullptr;
/* ... */
delete[] p;
}
Array(size_t siz) : s(siz) {
p = new Base *[s];
}
void setBase(Base *pb, size_t id) { p[id] = pb; }
Base *getBase(size_t id) { return p[id]; }
private:
Base **p = nullptr;
size_t s;
};
int main()
{
Array a1(2);
Base *b1 = new Derived_1[4]{};
Base *b2 = new Derived_3[7]{};
a1.setBase(b2, 0);
a1.setBase(b1, 1);
// Видалення b1, b2 виконає ~Array
Array a2(3);
a2.setBase(new Derived_1[5]{}, 0);
a2.setBase(new Derived_3[3]{}, 2);
a2.setBase(new Derived_2[1]{}, 1);
// Видалення об'єктів Base виконується вручну
delete[] a2.getBase(2), a2.setBase(nullptr, 2);
delete[] a2.getBase(0), a2.setBase(nullptr, 0);
delete[] a2.getBase(1), a2.setBase(nullptr, 1);
return 0;
}