Ошибка чтения символов строки переполнения стека

Я пытаюсь сохранить значение из

vector<vector<string>> data;

в переменную const char *, объявленную в файле .h, следующим образом:

heightmapName = data[0][1].c_str();

Когда я отлаживаю программу, я замечаю, что переменная heightmapName вернуть это

heightmapName 0xcdcdcdcd <Error reading characters of string.>  const char *

Однако, если я объявлю новый const char* и инициализировать это так:

    const char* what = data[0][1].c_str();
heightmapName = data[0][1].c_str();

what переменная хранит данные просто отлично, в то время как heightmapNameне делает.

Это функция:

void Configuration::fileParser(string fileName)
{
vector<vector<string>> data;
string line;
string delimiter = " ";
ifstream ss(fileName);
if (ss)
{
while (getline(ss, line))
{
vector<string> dataLine;
string token = line.substr(0, line.find(delimiter));
string value = line.substr(line.find(delimiter) +1);
dataLine.push_back(token);
dataLine.push_back(value);
data.push_back(dataLine);
}
ss.close();
}
//storeData(data);
const char* ahah = data[0][1].c_str();
heightmapName =    data[0][1].c_str();
}

Почему это происходит? и как я могу решить это?

пс. Я использую Visual Studio 2017

-1

Решение

Независимо от проблемы или реализации, предполагая, что тип heightmapName это действительно const char *это не сработает.

Время жизни data ограничен временем жизни fileParser. Увидеть Что такое время жизни std :: string :: c_str ()?

Следовательно, в конце этой функции данные, указанные data[0][1].c_str() станет недействительным.

Попробуйте скопировать данные, если это необходимо. Или сделайте heightmapName как std :: string.

(Дополнительные советы: если это указатель, подумайте о применении правила пяти: Как на самом деле реализовать правило пяти? — еще одна причина избегать ручного управления памятью)

В общем, я избегаю необработанных указателей в классах C ++, используя умные указатели или структуры (такие как std :: string), которые управляют памятью для меня, это означает, что мне не нужно беспокоиться о правиле 3 или правиле 5, так как я не нужно вручную управлять этими ресурсами.

обновление: вы упомянули, что он «работает» для вас в (теперь удален) сущности.

Такой доступ к памяти после окончания жизни не определен. Одним поведением вполне может быть то, что оно волшебным образом «работает». Скорее всего, эта память просто еще не была перезаписана.

1

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

Других решений пока нет …

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