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

C++ 读取字符串C+的字符时出错+;,c++,string,char,C++,String,Char,我正在尝试存储来自 vector<vector<string>> data; 调试程序时,我注意到变量heightmapName返回 heightmapName 0xcdcdcdcd <Error reading characters of string.> const char * what变量可以很好地存储数据,而heightmapName不能 这就是功能: void Configuration::fileParser(string fileName

我正在尝试存储来自

vector<vector<string>> data;
调试程序时,我注意到变量
heightmapName
返回

heightmapName 0xcdcdcdcd <Error reading characters of string.>  const char *
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();
}
void配置::fileParser(字符串文件名)
{
矢量数据;
弦线;
字符串分隔符=”;
ifss(文件名);
if(ss)
{
while(getline(ss,line))
{
矢量数据线;
字符串标记=line.substr(0,line.find(分隔符));
字符串值=line.substr(line.find(分隔符)+1);
数据线。推回(令牌);
数据线。推回(值);
数据。推回(数据线);
}
ss.close();
}
//存储数据(数据);
const char*ahah=data[0][1].c_str();
heightmapName=数据[0][1]。c_str();
}
为什么会这样?我怎样才能解决这个问题


另外,我正在使用visual studio 2017

,不管问题或实现如何,假设
heightmapName
的类型确实是
const char*
,这是行不通的

数据的生存期受fileParser生存期的约束。看

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

如果需要,考虑复制数据。或者将heightmapName设置为std::字符串

(附加提示:如果是指针,考虑应用五的规则:避免手动内存管理的另一个原因)

一般来说,我使用C++智能指针或结构管理器(比如STD::String)来避免内存指针,这意味着我不需要担心3或5的规则,因为我不需要手动管理这些资源。 更新:您在(现在删除)要点中提到它对您“有效”


在生命周期结束后这样访问内存是未定义的。一种行为很可能是它神奇地“起作用”。最有可能的是,该内存还没有被覆盖。

不管问题或实现如何,假设
heightmapName
的类型确实是
const char*
,这是行不通的

数据的生存期受fileParser生存期的约束。看

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

如果需要,考虑复制数据。或者将heightmapName设置为std::字符串

(附加提示:如果是指针,考虑应用五的规则:避免手动内存管理的另一个原因)

一般来说,我使用C++智能指针或结构管理器(比如STD::String)来避免内存指针,这意味着我不需要担心3或5的规则,因为我不需要手动管理这些资源。 更新:您在(现在删除)要点中提到它对您“有效”


在生命周期结束后这样访问内存是未定义的。一种行为很可能是它神奇地“起作用”。最有可能的是,该内存尚未被覆盖。

0xCDCD。。看起来像是未初始化的堆内存:请发布一条消息,没有人知道
数据
是如何、何时或在何处初始化、使用、填充数据等。我用函数的代码编辑了这个问题。
heightmapName
未定义。它没有类型。此代码不完整,可能无法编译。它是
配置
类中的一个字段吗?另外,您发布了一个类的成员函数。如果这不是静态成员函数,并且该
配置
对象无效,则您将对其执行的任何操作都将无效。您需要向我们显示一个,而不是类的一个片段。0xCDCD。。看起来像是未初始化的堆内存:请发布一条消息,没有人知道
数据
是如何、何时或在何处初始化、使用、填充数据等。我用函数的代码编辑了这个问题。
heightmapName
未定义。它没有类型。此代码不完整,可能无法编译。它是
配置
类中的一个字段吗?另外,您发布了一个类的成员函数。如果这不是静态成员函数,并且该
配置
对象无效,则您将对其执行的任何操作都将无效。您需要向我们展示一个,而不是一个类的片段。
    const char* what = data[0][1].c_str();
    heightmapName = data[0][1].c_str();
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();
}