2014-06-07 69 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 *指向某個超出範圍的位置。