我正在尝试从
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();
}
为什么会这样呢?我该如何解决呢?
ps。我正在使用Visual Studio 2017
最佳答案
不管问题或实现如何,假设heightmapName
的类型确实是const char *
,那将无法正常工作。data
的生存期受fileParser生存期的约束。见What is std::string::c_str() lifetime?
因此,在该函数结束时,data[0][1].c_str()
指向的数据将变为无效。
如果需要,请考虑复制数据。或者将heightmapName设为std :: string。
(其他提示:如果是指针,请考虑应用“五则规则”:How to actually implement the rule of five?-避免手动内存管理的另一个原因)
通常,我通过使用智能指针或为我管理内存的结构(例如std :: string)来避免C ++类中的原始指针,这意味着我不必担心3或5的规则。无需手动管理这些资源。
更新:您提到它(现在已删除)要点为您“工作”。
生命周期结束后,像这样访问内存是不确定的。一种行为很可能是它神奇地“起作用”。最有可能的是,该内存尚未被覆盖。