2011-04-07 42 views
0

我知道這樣的問題已經被問到死,但我想知道是否有無論如何使用Boost庫指針等做我的問題說沒有基本上我有以下的一段清理代碼刪除對象的雙維度的QList(的QList <的QList>)有沒有辦法安全地刪除非唯一指針的QList到MYOBJECT?

#include <QList> 
QList< QList<MyObject*> > m_Data; 
... 
void CleanupMyObjectList 
{ 
int numFrames = m_Data.size(); 
for(int i=0; i < numFrames; i++) 
{ 
    int numObjects = m_Data.at(i).size(); 

    for(int j=0; j < numObjects; j++) 
    { 
     MyObject* removedObject = m_Data[i].at(j); 
     if(removedObject != NULL) 
     { 
      delete removedObject;//This assumes that the pointers are UNIQUE in this list!!! If not it will crash!!! 
      removedObject = NULL; 
     } 
    } 
    m_Data[i].clear(); 

} 

m_Data.clear(); 
} 

指向指針,當我試圖清理非唯一或共享(填充列表它確實崩潰是這個正確的術語?)的指針,例如,當M_DATA [0] [1]等於M_DATA [1] [1]。

我知道爲什麼會崩潰,所以請保存解釋爲,而是我想知道是否有無論如何與代碼儘可能小的修改安全地刪除這些對象。

+0

是myObject的也許是自QObject衍生? – 0xbaadf00d 2011-04-07 09:36:09

回答

5

最簡單的方法是創建一個臨時std::set<MyObject*>。迭代m_Data,而不是直接刪除指針,將它們添加到集合中。接下來,刪除集合中的所有指針。 std::set中沒有重複項。

您可以安全地刪除NULL指針。無需檢查

+0

不錯!我從來沒有想過使用臨時容器來完成這項工作。我想我也可以使用Qt庫QSet來做同樣的事情嗎? – fisyher 2011-04-07 09:25:53

+0

是的,你可以做到這一點。 – 0xbaadf00d 2011-04-07 09:35:08

+0

或使用std :: sort和std :: unique。 – 2011-04-07 09:46:07

1

因爲你不希望使用升壓共享指針, 您可以使用QList< QList<QSharedPointer<MyObject>> > m_Data;代替QList< QList<MyObject*> > m_Data;

相關問題