有没有办法安全删除MyObject的非唯一指针的QList?

时间:2011-04-07 09:13:24

标签: c++ qt list shared-ptr

我知道这个问题已经被要求死亡,但我想知道是否有任何方式要做我在问题中所说的没有使用Boost库指针等。基本上我有下面的一段清理代码,用于删除二维QList(QList< QList>)中指针所指向的对象

#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]。

我知道它崩溃的原因所以请保存解释,但我想知道是否有安全删除这些对象,尽可能少修改代码。

2 个答案:

答案 0 :(得分:5)

最简单的方法是创建一个临时std::set<MyObject*>。迭代m_Data,而不是立即删除指针,将它们添加到集合中。接下来,删除集合中的所有指针。 std::set中没有重复项。

您可以安全地删除NULL指针。无需检查

答案 1 :(得分:1)

因为你不想使用boost共享指针, 您可以使用QList< QList<QSharedPointer<MyObject>> > m_Data;代替QList< QList<MyObject*> > m_Data;