Нарушение доступа malloc и наследование переполнения стека

У меня есть 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;
}

Так в принципе, что я делаю не так? Как я получаю нарушение прав доступа из этого кода? Все данные имеют правильный размер и являются законными.

1

Решение

Когда вы используете 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 ().

2

Другие решения

Других решений пока нет …