我正在尝试从

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的规则。无需手动管理这些资源。

更新:您提到它(现在已删除)要点为您“工作”。

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

09-26 22:01