'&安培;' :绑定成员函数表达式Thread上的非法操作

时间:2014-07-30 06:08:01

标签: c++ multithreading

我正在尝试在一个线程中运行一个成员函数,但是我在绑定成员函数上得到错误非法操作,我不确定我做错了什么。我想如果有人能解释我做错了什么以及为什么我得到这个错误,并给我一个如何解决它的例子。代码如下所示:

void GameWorld::SetupWorld()
{
    // create the window (remember: it's safer to create it in the main thread due to OS limitations)
    RenderWindow window(VideoMode(800, 600), "OpenGL");

    // deactivate its OpenGL context
    window.setActive(false);

    // launch the rendering thread
    Thread thread(&Render, &window);//This line gives the error
    thread.launch();
}

void GameWorld::Render(RenderWindow* window)
{
    Texture texture;
    Sprite sprite;

    if (!texture.loadFromFile("sprite.png"))
    {

    }

    sprite.setTexture(texture);

    // the rendering loop
    while (window->isOpen())
    {

        // clear the window with black color
        window->clear(Color::White);

        // draw everything here...
        window->draw(sprite);

        // end the current frame
        window->display();
    }
}

2 个答案:

答案 0 :(得分:1)

您有一个严重的undefined behavior案例,无法将指向局部变量的指针传递给该线程。

一旦函数返回,该变量将超出范围,对象将被破坏,留下指向未分配内存的指针。


如果Render函数不是static,也会出现问题,因为非静态成员函数有一个隐藏的第一个参数,它成为成员函数内的this指针。这可能是编译器抱怨的问题。


可能的第三个问题可能是,SetupWorld函数返回后,您的thread变量也将超出范围并被破坏。根据您使用的线程框架,它可能会意外地终止线程。

答案 1 :(得分:0)

要解决编译错误,请将投诉行更改为Thread thread(&GameWorld::Render, &window)

但是,为了完整起见,您应该阅读@Some Programme dude的答案。