基于范围的for循环的对象生存期问题

时间:2014-01-18 17:05:17

标签: c++ c++11 for-loop auto object-lifetime

我目前正在将我的代码转换为C ++ 11并且在以下基于范围的for循环中遇到问题(FWIW,相同的代码在使用BOOST for_each之前运行得很好)。

mLibraryFiles成员(STL向量)是单例实例的一部分,保证在方法返回后存在,但是当调用者检查返回的对象时,它只包含垃圾。 / p>

通过它进行调试似乎在从方法返回之后从预期内容转为垃圾,所以我想我一定是对C ++ 11基于范围的循环实际工作方式有所了解:

Entry* FindEntry(string inName)
{  Entry *rs = NULL;

   for (auto libraryEntry : mLibraryFiles)
   {
      if (libraryEntry.filename.compare(inName) == 0)
      {
         rs = &libraryEntry;
         break;
      }
   }

   return rs;
}

我原以为libraryEntry变量代表mLibraryFiles向量中的实际对象?

任何见解都非常感谢!
(编译器是LLVM 5.0虽然我怀疑这很重要..)

2 个答案:

答案 0 :(得分:8)

向量中的值将被复制到循环中的libraryEntry,因此您有一个指向复制值的指针,该值在循环后不再存在。使用auto& libraryEntry

答案 1 :(得分:4)

libraryEntry声明为auto&,否则为临时副本,其生命周期与for循环绑定。这就是为什么我更喜欢写对象的实际类型而不是auto