Есть ли способ безопасно удалить QList неуникальных указателей на MyObject?

#c #qt #list #shared-ptr

#c #qt #Список #shared-ptr

Вопрос:

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

Я знаю, почему происходит сбой, поэтому, пожалуйста, сохраните объяснение этого, но я скорее хочу знать, есть ли способ безопасно удалить эти объекты с как можно меньшим изменением кода.

Комментарии:

1. Возможно, MyObject является производным от QObject?

Ответ №1:

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

NULL Указатель можно безопасно удалить. Нет необходимости проверять это

Комментарии:

1. Приятно! Я никогда не думал об использовании временного контейнера для выполнения этой работы. Я предположил, что я также могу использовать QSet из библиотеки Qt, чтобы сделать то же самое правильно?

2. Только что опробовал предложенное решение, и оно отлично сработало! Спасибо всем за быстрые ответы

Ответ №2:

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