我一直在玩下面这段代码。 file_string
返回一个临时字符串,该字符串只能“生效”直到语句结束。在Visual Studio 2008中,当您使用pTempFolder
时,它会按预期包含垃圾。但在Linux中,使用英特尔编译器11.0,pTempFolder
仍指向有效字符串。编译器是否有关于临时销毁的不同政策,那种渴望(视觉)与懒惰(英特尔)?或许这只是一个巧合?
boost::filesystem wpathTempFolder("/tmp");
const wchar_t* const pTempFolder = wpathTempFolder.file_string().c_str();
// use pTempFolder
BTW,即boost文件系统版本2.我还看到在升级文件系统版本3中不推荐file_string
。并且有一个新的c_str
方法可以在字符串&而不是临时字符串。
/*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()
答案 0 :(得分:5)
可能,该字符串仍然无效,只是在操作系统级别尚未取消分配该部分内存并且“正好”工作。该程序展示了未定义的行为 - 它总是包括“可以继续工作,好像什么都没有出错”。 Visual Studio在这里完全正确,可以使您的程序崩溃或几乎任何事情。
答案 1 :(得分:2)
临时(有一些例外)的生命周期是直到
结束了完整的表达。数组对象的生命周期指向
通过std::string::c_str()
的返回值不会超过
字符串对象本身的(可以更短,如果有的话)
在字符串上调用非const函数。访问
对象在其生命周期结束后是未定义的行为,所以
你不能从编译器的作用中得出任何结论。