关于破坏临时工作者的编制政策

时间:2011-04-12 08:58:15

标签: c++ visual-studio-2008 compiler-construction intel

我一直在玩下面这段代码。 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()

2 个答案:

答案 0 :(得分:5)

可能,该字符串仍然无效,只是在操作系统级别尚未取消分配该部分内存并且“正好”工作。该程序展示了未定义的行为 - 它总是包括“可以继续工作,好像什么都没有出错”。 Visual Studio在这里完全正确,可以使您的程序崩溃或几乎任何事情。

答案 1 :(得分:2)

临时(有一些例外)的生命周期是直到 结束了完整的表达。数组对象的生命周期指向 通过std::string::c_str()的返回值不会超过 字符串对象本身的(可以更短,如果有的话) 在字符串上调用非const函数。访问 对象在其生命周期结束后是未定义的行为,所以 你不能从编译器的作用中得出任何结论。