矢量元素输出垃圾

时间:2014-06-07 00:44:54

标签: c++ vector output garbage

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

这是读取它的代码。我在这里添加了输出以供测试,并且它正在成功读取它。

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;
}

1 个答案:

答案 0 :(得分:2)

您正在将指向szUserszPass的指针推回到Vector中并在此之后返回。这很糟糕,因为szUserszPass是局部变量,一旦从函数返回就会被破坏。

现在

vector<char*> LoginInfo = main->GetAccount(i);

char* szUser = LoginInfo[0];
char* szPass = LoginInfo[1];

在这里,您可以访问当前指向某些垃圾的这些指针。这是未定义的行为。您应该重新考虑您想要做的事情,并且可能希望使用std::string而不是处理char *

通过使它成为vector<std::string>,您将获得内部字符串的正确副本,而不必担心丑陋的char *指向某个超出范围的位置。< / p>