Элемент векторного вывода мусора

В моем классе есть функция, которая возвращает вектор, содержащий пользовательские и пассивные данные, прочитанные из 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

Решение

Вы отодвигаете указатели на szUser а также szPass в ваш Вектор и верните его после этого. Это плохо, потому что szUser а также szPass являются локальными переменными, которые будут уничтожены, как только вы вернетесь из функции.

Сейчас

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

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

здесь вы получаете доступ к указателям, которые в данный момент указывают на какую-то фигню. Это неопределенное поведение. Вы должны переосмыслить то, что вы хотите сделать и, возможно, захотите использовать std::string вместо обработки char *«S.

Делая это vector<std::string> вы получите правильные копии строк внутри, и вам не придется беспокоиться о уродливом char *указывает на какое-то место, которое вышло за рамки.

2

Другие решения


По вопросам рекламы [email protected]