0

我正在开发一款游戏,但遇到了一个奇怪的小问题......我想知道这里是否有人能够解决这个问题并向我解释(它让我吃不消!)

首先,这是相关代码。

// even if this data is not set, it returns ""
// so it's pretty much never null
// but if the function returns something, 
// it will be the string representation of a 64bit unsigned int
const char* c_KickID = GetGameData("kick_member_id");

//gets my ID, works fine.
unsigned long long myID = GetMyID();

if(c_KickID != NULL)
{
    //here i convert it to a unsigned 64-bit int
    unsigned long long kickID;
    std::stringstream ss(c_KickID);
    ss >> kickID;

    //now I compare the IDs...
    if (myID == kickID)
    {
        //kick player
    }
}

游戏是1对1多人游戏。这个包含函数是一个回调函数,只要发生值得注意的事情(例如踢玩家或开始游戏)就会运行。我有 2 台计算机正在测试在线内容(一台 Windows 7 机器和 Windows XP 机器)。

在这种情况下,当两个玩家同时按下“开始游戏”时,会可靠地出现一个奇怪的错误。Windows XP 机器播放器将被踢(通过上面的代码) - 这表明GetGameData("kick_member_id")返回了他的 ID……但它没有。

调试:

  • 我已经注释掉了设置 GameData“kick_member_id”值(即禁用踢)的代码,以确保 - 并且错误继续发生。主机没有踢客户端。
  • 我已经输出c_KickID到一个文件并且它是空的(XP机器没有Visual Studio,所以我不能在它上面设置断点,所以我只是将它的内容输出到一个文件中)。
  • 我试图明确地踢 XP 播放器。他们的 ID 已成功写入输出文件,并按预期被踢了。
  • 我已经输出kickID到一个文件,它等于myID,这就解释了为什么if (myID == kickID)通过。

回顾一下:

// This returns an empty char array
const char* c_KickID = GetGameData("kick_member_id");

//get my id... 
unsigned long long myID = GetMyID();

//Then I run this. Keeping in mind, c_KickID is empty
unsigned long long kickID;
std::stringstream ss(c_KickID);
ss >> kickID; //<--- now kickID == myID

所以......当将空c_KickID转换为时unsigned long long,它被设置为myID......这怎么可能?我完全失去理智了!

我已经通过将 a 转换char *为 astd::string并检查它是否为空来解决这个问题,如果它是空的,那么我只是绕过这个代码。但我仍然不知道问题到底是什么。我为此失眠了!!!

4

1 回答 1

3

如果c_KickID是一个空的以 null 结尾的字符串,则 stringstreamss也将为空,并且ss >> kickID不会产生任何影响。

由于kickID是未初始化的,它的值是未指定的并且使用它是未定义的。一种可能的结果是,它在堆栈中的该内存位置具有任何随机位,可能等于myID.

于 2013-05-28T03:04:54.607 回答