函数不会导致错误,但不会返回程序

时间:2012-01-16 01:45:15

标签: c++ sfml

每当我调用一个函数时,我都会遇到这个非常恼人的问题:

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 个答案:

答案 0 :(得分:4)

如果一个函数不会返回声音,就像你之前在某个地方弄乱了堆栈一样 - 这很可能是一个超出范围的写入。

或者可能因为你最终在atexit中可能会有一个未捕获的异常被抛出。

无论哪种方式 - 欢迎来到编程的乐趣 - 现在你必须找到一个可能在你的函数卡住之前很久就会发生的错误

您可以尝试一些工具,如valgrind(如果它可用于Windows)或其他一些边界检查器。