У меня есть GameObject, который содержит массив Shapes (назначается через malloc). Фигуры имеют список точек и могут быть унаследованы как полигоны.
Код инициализации:
GameObject g1(true, true);
Color c(0, 0, 1, 0);
Point p(100, 100, 0);
Polygon s(p, c);
s.addPoint(p);
s.createRegularShape(4, 50.0f);
g1.addShape(s);
Это в шапке.
Shape* shapes;
Это где он ломается (когда я пытаюсь получить доступ к данным)
void GameObject::draw(unsigned int gameTime)
{
if(visible)
{
for(int i = 0; i < count; i++)
shapes[i].draw();//Access violation happens here
}
}
Вот как я добавляю Shape в массив Shape.
void GameObject::addShape(Shape const& shape)
{
if(count == size)
{
size += 4;
shapes = (Shape*)realloc(shapes, sizeof(Shape) * size);
}
shapes[count] = shape;
count++;
}
Здесь я выделяю память для Shape. Это вызывается в конструкторе, когда нам нужно выделить память для массива фигур.
void GameObject::clearShapes(int size)
{
if(count > 0)
free(shapes);
shapes = (Shape*)malloc(sizeof(Shape) * size);
count = 0;
GameObject::size = size;
}
Так в принципе, что я делаю не так? Как я получаю нарушение прав доступа из этого кода? Все данные имеют правильный размер и являются законными.
Когда вы используете malloc (), конструктор объектов не запускается. Как вы можете догадаться, это может создать всевозможные проблемы. использование new
вместо.
Не используйте malloc () в C ++ для создания объектов.
Это:
Shape* shapes;
это массив Shape
объекты, не массив Shape
указатели. Это означает начальное содержание:
shapes = (Shape*)malloc(sizeof(Shape) * size);
и позже:
shapes = (Shape*)realloc(shapes, sizeof(Shape) * size);
не построены. Итак, когда вы позже сделаете:
shapes[count] = shape;
Оператор присваивания вызывается на shapes[count]
, который не является построенным Shape
, Мне кажется, что вы не способны к неопределенному поведению здесь. Возможна любая ошибка во время выполнения.
Избавьтесь от malloc () и realloc () и вместо этого используйте std::vector<Shape>
где ты push_back()
новые фигуры. Если вы хотите продолжать делать это с простым динамическим массивом, вам следует вместо этого переключиться на массив указателей:
Shape** shapes;
И только держись Shape
указатели там. Это, конечно, требует рефакторинга логики вашей программы, и я не понимаю, почему вы захотите продолжать использовать malloc () и realloc ().
Других решений пока нет …