簡體   English   中英

使用shared_ptr刪除列表中的對象

[英]Deleting objects within a list with shared_ptr

我的目標是在彈丸碰到東西時將其刪除。 我在彈丸類中有一個函數,該函數返回彈丸狀態的布爾值(是否刪除)。 問題是我不知道應該在何時何地刪除它。

在我的項目中,我正在創建一個射彈,並使用std :: list將其添加到2個不同的類中。 第一類(假設它在ProjectileGestion中)包含所有射彈,並在將它們發送到DrawGestion之前在每個幀中對其進行更新(DrawGestion會將每個精靈按y的順序放置並繪制它們)。 第二類是四叉樹,它包含周邊內所有對象的列表(每個幀,它檢查列表中的每個對象是否仍適合並會檢查碰撞)。 目前,我不刪除任何彈丸,因為我不知道怎么做。 我想到了2個選擇:

  1. 只有ProjectileGestion可以刪除彈丸。 每當它刪除一個對象時,它都會刪除該對象並將指針的值更改為NULL。 在另一個類Quadtree中,當我使用迭代器遍歷列表時,我檢查每個迭代器是否等於NULL。 如果是,則該類將從列表中刪除迭代器並繼續。

     std::list<Object*>::iterator i = listOfObjects.begin(); while(i != listOfObjects.end()) { //Update() if((*i)->IsToDelete()) { delete *i; *i = NULL; listOfObjects.erase(i++); } else { i++; } } 

2:我在聲明對象時使用std :: shared_ptr。我做的檢查與選項1相同,但是我只從列表中刪除了對象,實際上並沒有刪除對象。 這樣,當每個列表都將其從對象中刪除后,該對象將被刪除。 (請注意,我之前從未使用過智能指針)。

那么,哪種方法更有效並且更不容易引起內存泄漏?

它們應該具有相同的效率,因為std :: unique_ptr將使用模板代碼,該模板代碼將為您編寫的內容添加相似的代碼。 但是,如果您更改了代碼或添加了其他處理指針的代碼,則使用std :: unique_ptr不太容易出錯。

更重要的是,unique_ptr代碼使您的意圖更加明確,並使代碼更易於閱讀和維護。 您可以通過查看聲明來判斷這是一個專有對象列表,並且擦除操作將變為1行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM