读取字符串C++的字符时出错

Error reading characters of string C++

本文关键字:出错 字符 字符串 C++ 读取      更新时间:2023-10-16

我正在尝试存储来自

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的生存期受文件解析器生存期的约束。 请参阅什么是 std::string::c_str(( 生命周期?

因此,在该函数结束时,data[0][1].c_str()指向的数据将变为无效。

如果需要,请考虑复制数据。或者将高度映射名称设为 std::string。

(附加提示:如果它是一个指针,请考虑应用五法则:如何实际实施五法则?-避免手动内存管理的另一个原因(

通常,我通过使用智能指针或为我管理内存的结构(例如 std::string(来避免C++类中的原始指针,这意味着我不需要担心 3 规则或 5 规则,因为我不需要手动管理这些资源。

更新:您提到它在(现已删除(要点中为您"工作"。

在生命周期结束后访问内存是不确定的。 一种行为很可能是它神奇地"工作"。 最有可能的是,该内存尚未被覆盖。