Pergunta

Eu estou usando um QList bastante complexo em uma derivação de QAbstractTableModel para armazenar dados:

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

Eu estou querendo saber se o QList e QHashes cuidar do deallaction ou se eu deveria fazê-lo. A documentação não é muito informativo neste caso.

Foi útil?

Solução

Porque você está criando os subitens com "novo", você tem que desalocar-los sozinho. Veja a função qDeleteAll uma maneira rápida de fazê-lo.

Existe uma razão pela qual você está usando de novo para criar esses hashs? (O código é, obviamente, apenas um trecho, por isso, os ponteiros poderiam ser usados ??e repassados ??em outro lugar.) Em geral, é muito mais simples apenas para construí-los na pilha de modo que a destruição acontece automaticamente.

Outras dicas

Como qualquer outra classe de contêiner em qualquer biblioteca C ++ praticamente, destruindo também ativa o processo de destruição dos elementos nele. isto é verdade para um MyClass array[3] simples, por vector<MyClass> STL e para QList<MyClass> do QT também.
Para se certificar que tudo é destruído você precisa ter certeza de que MyClass tem um destruidor que na verdade desaloca todos os recursos. Ter um QList de ponteiros não seguir esta regra porque ponteiros não tem destruidores. em vez disso você pode querer usar shared_ptr de impulso ou escreve sua própria embalagem ponteiro inteligente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top