更改一个指针后更改乘对象

时间:2018-10-10 03:51:49

标签: c++ sdl sdl-2

我只是在做一个Uni任务,尽管这很简单。但是我被卡住了。 任务很简单,只需要使用SDL2来构建输入映射系统即可。我创建一个Button结构,它具有按钮的名称,矩形和分配的键。

vector<Button>buttons = {
     Button("up", SDL_Rect{ 100,100,100,20 },"Up"),
     Button("down", SDL_Rect{ 100,200,100,20 },"Down"),
     Button("left", SDL_Rect{ 100,300,100,20 },"Left"),
     Button("right", SDL_Rect{ 100,400,100,20 },"Right"),
     Button("reset", SDL_Rect{ 400,400,100,20 },"R")
};

然后,当单击鼠标并且鼠标位置在按钮之一内部时,它将clickedButton指针分配给该按钮。

if (evt.type == SDL_MOUSEBUTTONDOWN)
{   
    int x, y;
    SDL_GetMouseState(&x, &y);
    for (auto &b : buttons)
    {
        if (x > b.btn_rect.x && x<(b.btn_rect.x + b.btn_rect.w) && y > b.btn_rect.y && y < (b.btn_rect.y + b.btn_rect.h))
        {
            cout << "Button " << b.btn_name << " clicked" << endl;
            btClicked = &b;
            break;
        }
    }
}

现在这是发生的奇怪事情。当btClicked不为null时,我为此按钮分配一个键名。但是每次我为btClicked分配另一个按钮时,分配给btClicked的先前按钮也会更改其键名。

if (evt.type == SDL_KEYDOWN)
{
    if(btClicked!=NULL)
    {
        btClicked->assigned_key = SDL_GetKeyName(evt.key.keysym.sym);//breakpoint here
        btClicked = NULL;
    }

您可以在下面看到断点调试。所有先前分配给btClicked的按钮均已更改。但是btClicked只是指向按钮之一。 The breakpoint Debug

有人知道这里发生了什么吗?请帮忙。

1 个答案:

答案 0 :(得分:4)

仅在下一次调用SDL_GetKeyName之前,保证返回值SDL_GetKeyName指向的字符串有效。在这种情况下,它似乎有一个静态缓冲区,可在每次调用时重复使用,因此所有Button最终都指向同一字符串。这意味着如果需要更长的有效期,则需要复制该字符串。

最简单的方法是让您的Button::assigned_key成员成为std::string而不是原始的const char*

无论如何,这几乎总是一个好主意,因为在对象中保留const char*成员会混淆所有权语义,并使应用程序更容易出现这种错误以及内存泄漏。