Shape ***newData = new Shape[_frames][_capacity]; //figure out this
Это не то, что вы думаете. Он только распределяет массив указателей на массивы в свободном хранилище. Предполагая, что _capacity
является константой, каждый указатель в массиве является указателем на другой фиксированный массив, который содержит ровно _capacity
экземпляров Shape
.Вот картинка:
index
+-----------+
newData --> | 0 | (pointer to a fixed array of _capacity instances of Shape)
+-----------+
| 1 | (pointer to a fixed array of _capacity instances of Shape)
+-----------+
| 2 | (pointer to a fixed array of _capacity instances of Shape)
+-----------+
| |
.......
| |
+-----------+
| _frames-1 | (pointer to a fixed array of _capacity instances of Shape)
+-----------+
(This is the only thing that is actually allocated)
Выражение new Shape[_frames][_capacity]
не выделяет достаточно памяти для фактического хранения _frame*_capacity
экземпляров Shape
.Кроме того, поскольку каждый указатель в массиве указывает на другой массив фиксированного размера , компилятор жалуется на непостоянную _capacity
в вашем фрагменте кода.
Вместо использования болезненно запутывающегоShape***
и new[_frames][_capacity]
business, используйте std::vector
для хранения линейного массива Shape
s, затем используйте схему адресации для эмуляции строк и столбцов, например:
// Exposition only
std::vector<Shape> data;
void ResizeMatrix(std::vector<Shape>& data, int frames, int capacity)
{
data.resize(frames * capacity);
}
// Populate data with Shapes
void IndexMatrix(int capacity_index, int frame_index, int capacity)
{
Shape& aShape = data[capacity_index + (capacity * frame_index)];
// Do something with it
}