为什么以及何时更改值?

时间:2014-03-22 22:00:21

标签: c++

请注意以下代码。我从std::string到c-style字符串并返回std::string的原因是因为bmd2create是C Binding API的一部分,它必须采用c风格的字符串。否则,我尽可能使用std::string

OtherFile.h

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());
}

Main.cpp的

const char * filename = std::string(filepath + "dataset1.out").c_str();

// *filename is 46 '.'

bmd2create(filename);

// *filename is now 0 '\0'

问题

文件名指针移动的位置和原因在哪里?什么是将其移回字符串开头的最佳方法?

1 个答案:

答案 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());