BOOST_FOREACH使作为GroupMember类成员的weak_ptr无效,请帮助我理解原因。
以下代码解释了错误:
class GroupMember
{
bool logInState;
boost::weak_ptr<CUser> wpUser;
};
GroupMember::iterator it;
BOOST_FOREACH(EachLevel aLevel, levels)
{
if(aLevel.exist(spUser))
{
it = aLevel.getIteratorToGroupMember( spUser );
//iterator (it) is valid as well as the group member's attributes (and weak_ptr)
}
}
//Iterator (it) seems to be valid but the weak_ptr is invalid.
//The counter to the object is more than 10 so the weak ptr is not expired.
以下代码完美无缺:
GroupMember::iterator it;
std::vector<EachLevel>::iterator itLevel;
for(itLevel = levels.begin(); itLevel != levels.end(); ++itLevel)
{
if(itLevel->exist(spUser))
it = itLevel->getIteratorToGroupMember( spUser );
}
//Here is iterator (it) valid (including the weak_ptr)
我看不出差异,可以吗?
谢谢!
答案 0 :(得分:3)
EachLevel aLevel
创建一个本地对象aLevel
,其范围仅在BOOST_FOREACH
范围内。如果你从这个对象中取iterator
,它将在循环外无效。您可以通过声明EachLevel& aLevel
将其更改为引用,这样就不会创建任何副本,并且您的迭代器仍然有效。在第二种情况下,您直接访问对象而不创建任何副本,因此它可以工作。
答案 1 :(得分:3)
您认为BOOST_FOREACH的实现方式与您的第二个代码段相同,这是一个错误的假设。
其次,在你的BOOST_FOREACH中,你按值迭代。请参考:
BOOST_FOREACH(EachLevel& aLevel, levels)
看看它是否有效。