質問
私は、データを格納するために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の世話をする場合、または私は思ったんだけど。ドキュメントは、この場合には非常に有益ではありません。
解決
あなたは「新しい」とサブ項目を作成しているので、
、あなたは自分で解放する必要があります。そうすることの簡単な方法のためqDeleteAll関数を参照してください。
あなたはこれらのhashsを作成するために、新しい使用している理由はありますか? (ポインタを使用し、他の場所の周りに渡すことができますので、あなたのコードは、ちょうどスニペットは、明らかである。)一般的に、それはその破壊が自動的に行われますので、ちょうどスタック上にそれらを構築するためにはるかに簡単です。
他のヒント
は、実質的に任意のC ++ライブラリ内の他のコンテナクラスのように、それを破壊することも、その中の要素のデストラクタを活性化させます。これは、同様にSTLのMyClass array[3]
用とQTのvector<MyClass>
のために、簡単なQList<MyClass>
についても同様です。
必ずすべてが破壊されていることを確認するには、MyClassのは確かにすべてのリソースの割り当てを解除するデストラクタを持っていることを確認する必要があります。ポインタはデストラクタを持っていないので、ポインタのQListのを持つことは、この規則に従っていません。代わりに、あなたはブーストのshared_ptrのを使用するか、または独自のスマートポインタラッパーを書きたいことがあります。
所属していません StackOverflow