2009-04-24 4 views
1

Я использую довольно сложный QList в выводе QAbstractTableModel для хранения данных:Как очистить комплекс QList?

class MyTableModel : public QAbstractTableModel { 
    Q_OBJECT 
    QList<QHash<int, QHash<int, QVariant> *> *> m_data; 
    /*...*/ 
}; 

MyTableModel::~TMusicTableModel() { 
    /* Should I deallocate QList items? */ 
} 

MyTableModel::setData(int row, int col, int type, QVariant value) { 
    /* inserting a new data field */ 
    QHash<int, QHash<int, QVariant> *> *row_hash = new QHash<int, QHash<int, QVariant> *>(); 
    QHash<int, QVariant> *role_hash = new QHash<int, QVariant>(); 
    type_hash->insert(type, value); 
    row_hash->insert(col, type_hash); 
    m_data.insert(row, row_hash); 
    return true; 
} 

Я интересно, если QList и QHashes заботиться о deallaction или если я должен сделать это. В этом случае документация не очень информативна.

ответ

5

Поскольку вы создаете подпункты с «новым», вам нужно их освободить самостоятельно. См. Функцию qDeleteAll для быстрого способа сделать это.

Есть ли причина, по которой вы используете новое для создания этих хешей? (Ваш код, очевидно, просто фрагмент, поэтому указатели могут использоваться и передаваться в другом месте.) Как правило, гораздо проще просто создать их в стеке, чтобы уничтожение происходило автоматически.

+0

это, кажется, единственный ответ, который является кратким и на самом деле отвечает на вопрос –

+0

да, это так. Благодаря! – WolfgangA

1

Как и любой другой контейнерный класс практически в любой библиотеке C++, его разрушение также активирует деструктор элементов в нем. это справедливо для простого MyClass array[3], для STL vector<MyClass> и для QT's QList<MyClass>.
Чтобы убедиться, что все уничтожено, вам необходимо убедиться, что MyClass имеет деструктор, который действительно освобождает все ресурсы. Наличие QList указателей не следует этому правилу, потому что указатели не имеют деструкторов. вместо этого вы можете захотеть использовать shared_ptr boost или написать собственную оболочку смарт-указателя.

Смежные вопросы