请注意以下代码。我从std::string
到c-style字符串并返回std::string
的原因是因为bmd2create
是C Binding API的一部分,它必须采用c风格的字符串。否则,我尽可能使用std::string
。
void bmd2create(const char * filename) {
std::string sFileName (filename);
// do things with sFileName
std::ostringstream ostr;
ostr << "\t(in) filename = " << filename << "\n";
logger.log(Logger::LogLevel::LOG_DEBUG, ostr.str());
}
const char * filename = std::string(filepath + "dataset1.out").c_str();
// *filename is 46 '.'
bmd2create(filename);
// *filename is now 0 '\0'
文件名指针移动的位置和原因在哪里?什么是将其移回字符串开头的最佳方法?
答案 0 :(得分:7)
这条线特别无用:
const char * filename = std::string(filepath + "dataset1.out").c_str();
您创建一个临时std::string
,然后使用c_str()
获取指向其内容的指针。在下一行执行之前,临时变量在完整表达式结束时被清除。那时指针无处可去。使用它是未定义的行为。
在调用bmd2create
之前,您认为指针正常的原因是指向的内存尚未被覆盖。但它不再由字符串拥有,因此任何未来的分配都可以用新对象替换它。
正确的代码是:
std::string filename = std::string(filepath) + "dataset1.out";
bmd2create(filename.c_str());