У меня есть динамически размещенный трехмерный массив указателей на класс:
class Foo {
public:
int a;
float b;
float c;
Foo(int x, float y, float z) { a = x; b = y; c = z; }
};
в классе:
class Bar {
public:
Foo ****p_arr;
Bar();
~Bar();
void Create();
};
, выделенный так (в Bar::Create()
):
p_arr = new Foo***[ARR_SIZE];
for (unsigned int i = 0; i < ARR_SIZE; ++i) {
p_arr[i] = new Foo**[ARR_SIZE];
for (unsigned int j = 0; j < ARR_SIZE; ++j) {
p_arr[i][j] = new Foo*[ARR_SIZE];
for (unsigned int k = 0; k < ARR_SIZE; ++k) {
if (rand() % (k + 1) < 1)
p_arr[i][j][k] = new Foo(i, j, k * 0.1f);
else
p_arr[i][j][k] = nullptr;
}
}
}
И я хочу удалить его (в ~Bar()
):
for (unsigned int i = 0; i < ARR_SIZE; i++) {
for (unsigned int j = 0; j < ARR_SIZE; j++) {
for (unsigned int k = 0; k < ARR_SIZE; k++) {
if (p_arr[i][j][k] != nullptr)
delete p_arr[i][j][k];
}
delete[] p_arr[i][j];
}
delete[] p_arr[i];
}
delete[] p_arr;
У меня есть std::vector
Bar
с, и когда я push_back
к вектору new item, вектор перераспределяется и вызывает деструктор. Когда я снова получаю доступ к p_arr
, он освобождается, и в деструкторе происходит сбой программы. Там написано:
0xC0000005: Access violation reading location 0xFFFFFFFF.
Здесь вылетает:
if (p_arr[i][j][k] != nullptr) // <- here
delete p_arr[i][j][k];
Как это исправить?