Функция не вызывает ошибок, но не вернется в программу - PullRequest
1 голос
/ 16 января 2012

У меня очень неприятная проблема, когда я вызываю функцию:

void renderGame::renderMovingBlock(movingBlock* blockToRender){
    sf::Shape blockPolygon;
    sf::Shape blockLine = sf::Shape::Line(blockToRender->getLineBegin().x,blockToRender->getLineBegin().y,blockToRender->getLineEnd().x,blockToRender->getLineEnd().y, 3.f,movingBlockLineColor);

    for(auto i = blockToRender->getVertexArray()->begin(); i!=blockToRender->getVertexArray()->end(); ++i){
        blockPolygon.AddPoint(i->x, i->y,  movingBlockBlockColor);
    }

    renderToWindow->Draw(blockLine);
    renderToWindow->Draw(blockPolygon);
}

Это простая функция, она берет указатель на объект и использует SFML для его отображения на экране.Это простой многоугольник, который движется по рельсу.

getVertexArray () возвращает указатель на вектор вершин объекта, renderToWindow - указатель на sf :: RenderWindow

Очень странная проблема, которая у меня естьв том, что я могу вызвать эту функцию, она не вернется, VC ++ ломается и указывает на:

int __cdecl atexit (
        _PVFV func
        )
{
        return (_onexit((_onexit_t)func) == NULL) ? -1 : 0;
}

Я получаю странное поведение здесь, я могу остановить эту функцию прямо перед выходом, вызвавФункция Display () и система («пауза»), она будет отображать все отлично, но на один шаг дальше, и это ломается.

Я добавлю, что я отправляю динамически размещенный объект, когда яустановить обычный все нормально.Странно, когда я отлаживаю программу, тогда полигон и линия имеют правильные координаты, все отображается правильно, но просто не может вернуться из функции.

1 Ответ

4 голосов
/ 16 января 2012

Если функция не будет возвращать звуки, подобные тем, что вы где-то испортили в стеке, - это, скорее всего, запись за пределы.

Или, возможно, из-за того, что вы оказались в atexit, возможно, возникло неисследованное исключение.

В любом случае - добро пожаловать в радости программирования - теперь вы должны найти ошибку, которая, вероятно, происходит задолго до того, как ваша функция застряла

Вы можете попробовать некоторые инструменты, такие как valgrind (если он доступен для windows) или некоторые другие средства проверки границ.

...