#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;