2014-06-07 41 views
1

我在我的类中得到了一个函数,它返回一个持有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; 
} 
+0

[未定义行为](http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope) – chris

回答

2

你推回指针szUserszPass到您的载体,之后返回。这很糟糕,因为szUserszPass是局部变量,一旦从函数返回就会被破坏。

现在

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

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

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

通过将其设置为vector<std::string>,您将得到正确的内部字符串副本,不必担心难看的char *指向某个超出范围的位置。