我一直在玩下面的代码。
file_string
返回一个临时字符串,该字符串只能“存活”到语句结束。在 Visual Studio 2008 中,当您使用 pTempFolder
时,它会包含预期的垃圾。但在 Linux 中,使用英特尔编译器 11.0,pTempFolder
仍然指向有效的字符串。编译器对于临时对象的销毁是否有不同的策略,即急切的(Visual)与惰性的(Intel)?或者这只是巧合?
boost::filesystem wpathTempFolder("/tmp");
const wchar_t* const pTempFolder = wpathTempFolder.file_string().c_str();
// use pTempFolder
顺便说一句,这是 boost 文件系统版本 2。我还看到
file_string
在 boost 文件系统版本 3 中已被弃用。并且有一个新的 c_str
方法可以对 string& 进行操作,而不是对临时字符串进行操作.
/*filesystem 2*/
const string_type file_string() const;
/*filesystem 3*/
const string_type& native() const; // native format, encoding
const value_type* c_str() const; // native().c_str()
很可能,该字符串仍然无效,只是碰巧该部分内存尚未在操作系统级别取消分配,并且它“碰巧”可以工作。该程序表现出未定义的行为,其中始终包括“可能会继续工作,就好像没有发生任何问题一样”。 Visual Studio 在这里完全正确地使您的程序或几乎任何东西崩溃。
临时对象的生命周期(有少数例外)直到 完整表达式结束。 指向的数组对象的生命周期 由
std::string::c_str()
的返回值不超过
字符串对象本身的长度(并且可能更短,如果有的话)
在字符串上调用非常量函数)。 访问一个
对象在其生命周期结束后是未定义的行为,所以
您无法从编译器的行为中得出任何结论。