C++ 基于范围的for循环的对象生存期问题
我目前正在将代码转换为C++11,并且在以下基于范围的for循环中遇到了问题(FWIW,相同的代码在使用BOOST for_之前运行得很好)C++ 基于范围的for循环的对象生存期问题,c++,c++11,for-loop,auto,object-lifetime,C++,C++11,For Loop,Auto,Object Lifetime,我目前正在将代码转换为C++11,并且在以下基于范围的for循环中遇到了问题(FWIW,相同的代码在使用BOOST for_之前运行得很好) mLibraryFiles成员(STL向量)是单例实例的一部分,保证在方法返回后存在,但是当调用方检查返回的对象时,它只包含垃圾 通过它进行调试似乎在从方法返回后从预期内容变成垃圾,所以我想我一定是在C++11基于范围的循环实际工作方式方面出错了: Entry* FindEntry(string inName) { Entry *rs = NULL;
mLibraryFiles
成员(STL向量)是单例实例的一部分,保证在方法返回后存在,但是当调用方检查返回的对象时,它只包含垃圾
通过它进行调试似乎在从方法返回后从预期内容变成垃圾,所以我想我一定是在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,尽管我对此表示怀疑。)将
libraryEntry
声明为auto&
否则它是一个临时副本,其生存期绑定到for循环。这就是为什么我更喜欢将对象的实际类型写入,而不是将auto
声明libraryEntry
为auto&
,否则它是一个临时副本,其生存期绑定到for循环。这就是为什么我更喜欢编写对象的实际类型,而不是auto
将向量中的值复制到循环中的libraryEntry,因此您有一个指向复制值的指针,该值在循环后不再存在。使用auto&libraryEntry
将向量中的值复制到循环中的libraryEntry,因此您有一个指向复制值的指针,该值在循环后不再存在。使用auto&libraryEntry
libraryEntry
是mLibraryFiles
元素的副本。请改用for(auto&libraryEntry:mLibraryFiles)
。llvm当前不是3.4版。你可能是说clang?@Nil Apple对其LLVM版本使用单独的版本编号方案。(是的,)苹果的版本不一定与上游LLVM版本一致,所以他们使用不同的编号方案来“避免混淆”。啊!很高兴知道,谢谢。@Nil是的,对于Xcode 5中显示的混淆版本表示抱歉,该版本声明Apple LLVM 5.0libraryEntry
是mLibraryFiles
元素的副本。请改用for(auto&libraryEntry:mLibraryFiles)
。llvm当前不是3.4版。你可能是说clang?@Nil Apple对其LLVM版本使用单独的版本编号方案。(是的,)苹果的版本不一定与上游LLVM版本一致,所以他们使用不同的编号方案来“避免混淆”。啊!很高兴知道,谢谢。@Nil是的,对于Xcode 5中显示的混淆版本表示抱歉,该版本声明Apple LLVM 5.0herb sutter说,尽可能使用auto并避免使用实际类型。它免费为您提供了typedef的灵活性。编写实际类型(也没有&
)也同样糟糕。herb sutter说,尽可能使用auto并避免使用实际类型。它免费为您提供了typedef的灵活性。如果没有&
,那么编写实际的类型也同样糟糕。