向量元素输出垃圾

Vector element outputting garbage

本文关键字:输出 元素 向量      更新时间:2023-10-16

在我的类中有一个函数,它返回一个从ini文件中读取的持有User和Pass的向量。

下面是读取它的代码。我在这里为测试添加了输出,它正在成功地读取它。

vector<char*> Main::GetAccount(int i)
{
    vector<char*> LoginInfo;
    char szUser[13];
    char szPass[13];
    char szBuf[3];
    _itoa_s(i, szBuf, 10);
    GetPrivateProfileString(szBuf, "UserID", "User", szUser, 13, ".\accounts.ini");
    GetPrivateProfileString(szBuf, "Pass", "Pass", szPass, 13, ".\accounts.ini");
    if (strcmp(szUser, "User") == 0)
    {
        char szBuffer[80];
        sprintf_s(szBuffer, "Cannot read account %i.", i);
        Log(szBuffer);
        exit(EXIT_FAILURE);
    }
    else
    {
        LoginInfo.push_back(szUser);
        LoginInfo.push_back(szPass);
        return LoginInfo;
    }
}

这里是我调用它的地方,也是出错的地方。

for (int i = 1; i < main->nBots + 1; i++)
{
    vector<char*> LoginInfo = main->GetAccount(i);
    char* szUser = LoginInfo[0];
    char* szPass = LoginInfo[1];
    cout << szUser << endl << szPass << endl;
}

您正在将指向szUserszPass的指针推回到Vector中,然后返回它。这很糟糕,因为szUserszPass是局部变量,一旦您从函数返回,它们将被销毁。

现在

vector<char*> LoginInfo = main->GetAccount(i);
char* szUser = LoginInfo[0];
char* szPass = LoginInfo[1];

访问当前指向垃圾的指针。这是未定义行为。你应该重新考虑你想做什么,可能想使用std::string而不是处理char *的。

通过将其设置为vector<std::string>,您将获得内部字符串的适当副本,并且不必担心丑陋的char *指向超出范围的某个位置。