为什么std :: getline会覆盖包含文件名的char数组?

时间:2016-07-05 21:00:10

标签: c++ linux

当我运行以下代码时,foobar_fname会在foobar_fname运行时被getline的内容覆盖:

ostringstream st_foobar_fname;
st_foobar_fname << foostr << BAR_CONST << barstr;
const char *foobar_fname = (st_foobar_fname.str()).c_str();

ifstream foobar_file(foobar_fname);
debug("Reading '%s'", foobar_fname);

string foobar_def = "";
if (getline(foobar_file, foobar_def)) {
  debug("'%s' reported message '%s'", foobar_fname, foobar_def.c_str());
} else {
  error("Unable to read '%s'", foobar_fname);
}

例如,如果foobar_fname=/home/user/fname/home/user/fname包含&#39; simple-text-content&#39;,则输出如下:

Reading '/home/user/fname'
'simple-text-content' reported message 'simple-text-content'

但是,如果/home/user/fname不存在(且getline失败),则输出正确无误:

Reading '/home/user/fname'
Unable to read '/home/user/fname'

我哪里错了?

(这是一段旧代码,我不想引入新的依赖项,因此c ++ 11,boost等不是可行的解决方案。)

1 个答案:

答案 0 :(得分:2)

您正在看到未定义行为的症状。

st_foobar_fname.str()

返回std::string

const char *foobar_fname = (st_foobar_fname.str()).c_str();

存储在行完成执行后无效的指针,因为它对应于临时对象。临时对象被破坏,你留下一个悬空指针。

如果您想保持价值,请使用std::string

std::string foobar_fname = st_foobar_fname.str();