Есть ли способ безопасно удалить QList неуникальных указателей на MyObject? - PullRequest
0 голосов
/ 07 апреля 2011

Я знаю, что этот вопрос задавался до смерти, но я хотел бы знать, есть ли возможность сделать то, что я сказал в вопросе без , используя указатели библиотеки Boost и т. Д. В основном у меня есть следующеефрагмент кода очистки, который удаляет объекты, на которые указывают указатели в двойном измерении 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 ]

5 голосов
/ 07 апреля 2011

Самый простой способ - создать временный std::set<MyObject*>. Итерируйте по m_Data, и вместо того, чтобы сразу удалять указатели, добавьте их в набор. Затем удалите все указатели в наборе. В std::set.

нет дубликатов

Вы можете безопасно удалить указатель NULL. Не нужно проверять, что

1 голос
/ 07 апреля 2011

Поскольку вы не хотите использовать общие указатели boost, вы можете использовать QList< QList<QSharedPointer<MyObject>> > m_Data; вместо QList< QList<MyObject*> > m_Data;

...