当我运行以下代码时,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等不是可行的解决方案。)
答案 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();