1

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を処理するのか、それとも実行する必要があるのか​​疑問に思います。この場合、ドキュメントはあまり有益ではありません。

4

2 に答える 2

5

「新規」でサブアイテムを作成しているため、自分でサブアイテムの割り当てを解除する必要があります。これを行う簡単な方法については、qDeleteAll関数を参照してください。

これらのハッシュを作成するためにnewを使用している理由はありますか?(コードは明らかに単なるスニペットであるため、ポインターを使用して他の場所に渡すことができます。)一般に、破棄が自動的に行われるように、スタック上にポインターを作成する方がはるかに簡単です。

于 2009-04-25T13:53:56.460 に答える
1

事実上すべてのC++ライブラリの他のコンテナクラスと同様に、それを破棄すると、その中の要素のデストラクタもアクティブになります。これは、単純なMyClass array[3]もの、STL vector<MyClass>、およびQTにも当てはまりQList<MyClass>ます。
すべてが確実に破壊されるようにするには、MyClassにすべてのリソースの割り当てを実際に解除するデストラクタがあることを確認する必要があります。ポインターにはデストラクタがないため、ポインターのQListを持つことはこの規則に従いません。代わりに、boostのshared_ptrを使用するか、独自のスマートポインターラッパーを作成することをお勧めします。

于 2009-04-25T00:16:05.163 に答える