2010-11-26 92 views
1

BOOST_FOREACH使位於GroupMember類中的成員weak_ptr無效,請幫助我理解原因。在BOOST_FOREACH循環內設置的變量在循環外無效,爲什麼?

下面的代碼說明錯誤:

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) 

我看不出差別,你能嗎?

謝謝!

回答

3

您認爲BOOST_FOREACH在您的第二個代碼片段中執行,這是錯誤的假設。

其次,在您的BOOST_FOREACH中,按值重複。請參考:

BOOST_FOREACH(EachLevel& aLevel, levels) 

並查看它是否有效。

3

EachLevel aLevel創建一個本地對象aLevel,其範圍僅限於BOOST_FOREACH。如果從這個對象中取出iterator,它將在循環外部無效。您可以通過聲明EachLevel& aLevel將其更改爲參考,以便不創建副本並且您的迭代器保持有效。在第二種情況下,您直接訪問對象而不創建任何副本,因此它可以工作。

+0

啊,我明白了!它與增加的參考一起工作。 – user521048 2010-11-26 08:44:50

相關問題