Я пытаюсь сохранить значение из
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
Независимо от проблемы или реализации, предполагая, что тип heightmapName
это действительно const char *
это не сработает.
Время жизни data
ограничен временем жизни fileParser. Увидеть Что такое время жизни std :: string :: c_str ()?
Следовательно, в конце этой функции данные, указанные data[0][1].c_str()
станет недействительным.
Попробуйте скопировать данные, если это необходимо. Или сделайте heightmapName как std :: string.
(Дополнительные советы: если это указатель, подумайте о применении правила пяти: Как на самом деле реализовать правило пяти? — еще одна причина избегать ручного управления памятью)
В общем, я избегаю необработанных указателей в классах C ++, используя умные указатели или структуры (такие как std :: string), которые управляют памятью для меня, это означает, что мне не нужно беспокоиться о правиле 3 или правиле 5, так как я не нужно вручную управлять этими ресурсами.
обновление: вы упомянули, что он «работает» для вас в (теперь удален) сущности.
Такой доступ к памяти после окончания жизни не определен. Одним поведением вполне может быть то, что оно волшебным образом «работает». Скорее всего, эта память просто еще не была перезаписана.
Других решений пока нет …