2012-10-22 99 views
1

我有凌亂的指針,我只是不能找出的錯誤是什麼。我可以利用一些幫助與列表的問題C#程序員膨化倒數第二

所以基本上我有類似一疊牌和這些牌被保存在一個列表中。我只想取最上面的那個,並將它返回給函數。我可以用pop_back(),但最後一張牌已經留,因爲它是因爲它是cardback

Card * CardStack::HandOut() 
{ 
    if (m_Stack.size() > 1) 
    { 
     list<Card *>::iterator it = m_Stack.end(); 
     advance(it, -2); 
     Card *ret = *it; 
     Card tmp = *ret; 
     Card *tmpp = &tmp; 
     m_Stack.remove(ret); 
     return tmpp; 
    } 
    return NULL; 
} 

所以我想總是彈出倒數第二卡(我用的紋理和東西后使其)背部。 我敢肯定,其總的初學者的錯誤:(

+0

「凌亂的指針」 - 你的意思是「凌亂的指針使用」,對吧? – Xeo

+0

我們的英語不是這裏最好的:) – TheSentry

回答

3

你是返回一個指向一個局部變量,

Card tmp = *ret; 
Card *tmpp = &tmp; 
m_Stack.remove(ret); 
return tmpp; 

該函數退出後已經不存在了。所以,當你使用指針後來,你調用未定義的行爲。

你不應該tmptmpp打擾,回到ret應該做吧,remove不破壞卡,它只是從堆棧中刪除(指針)它。

+0

是的,我已經認爲這將是一個問題... 那麼我怎麼能複製整個對象,因爲沒有任何.copy()因爲我知道:( – TheSentry

+0

你不需要,'ret'已經指向了卡,'remove'只是從堆棧中刪除它(實際上是指向卡的指針)。 –

+0

哇謝謝吧這就是事情我不知道^^我以爲刪除只是刪除了整個對象:D 欣賞快速幫助!謝謝:) – TheSentry

1

您可以直接通過迭代器擦除項目指針。這也確保使用.remove()移除O(1)而不是O(n),並且如果內容不唯一,則避免移除額外的項目。

std::list<Card*>::iterator it = m_Stack.end(); 
    std::advance(it, -2); 
    Card* res = *it; 
    m_Stack.erase(it); 
    return res; 

請注意,這不是在C++中慣用的存儲原始指針。如果複製價格低廉,或者使用智能指針(例如list<shared_ptr<Card> >),則按值存儲對象(即使用list<Card>)會更好,因此可以在不再使用存儲器時自動收集存儲器。

+0

有趣的解決方案:)謝謝我應該更多地進入interators! – TheSentry

+0

我會看看共享指針感謝:)當我使用共享ponters我不必擔心刪除它們? – TheSentry

+0

@TheSentry:幾乎正確。 shared_ptr使用引用計數,因此如果您創建循環引用,它將不會被釋放。但它仍然比手動管理好得多。另見http://stackoverflow.com/questions/106508/what-is-a-smart-pointer-and-when-should-i-use-one。 – kennytm