Qt では、QObject から継承するオブジェクトを作成し、それを親に設定すると、親が子を削除する責任があることを理解しています。また、スタック上にオブジェクトを作成すると、スコープ外になると削除されることも理解しています。
QStringList (または任意の QList ) 内の項目を明示的に削除してからリスト自体を削除する場合については、頭を悩ませているわけではありません。
QStringList を作成し、以下のように入力するかどうかを検討してください。
QStringList multiPartPortionList;
multiPartPortionList = multiPartPortion.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
次に、リストに含まれるアイテムを明示的に削除してから、リスト自体を削除しようとして、このメソッドを呼び出します。
void MyClass::deleteList(QStringList list) {
// Now cleanup
QStringList *delList = new QStringList(list);
int numObjects = delList->count();
for (int i=0; i < numObjects; i++)
delete (new QString(list.takeAt(0)));
delList->clear();
delete delList;
delList = 0;
}
qDeleteall(list) を呼び出すことはできません。これは、ポインターが必要なためです。また、次のこともできません。
delete list;
'delete' に与えられた引数でエラーが発生するため、ポインタが必要です。
次のようなセグメンテーション違反が発生します。
void MyClass::deleteList(QStringList list) {
// Now cleanup
QStringList *delList = &list; // <--- Seg fault with this
int numObjects = delList->count();
for (int i=0; i < numObjects; i++)
delete (new QString(list.takeAt(0)));
delList->clear();
delete delList;
delList = 0;
}
次のようなセグメンテーション違反も発生します。
void MyClass::deleteList(QStringList list) {
// Now cleanup
QStringList *delList = &list;
int numObjects = delList->count();
for (int i=0; i < numObjects; i++)
delete &(list.takeAt(0)); // <--- Seg fault with this
delList->clear();
delete delList;
delList = 0;
}
そして、次のようなセグメンテーション違反も発生します。
void MyClass::deleteList(QStringList list) {
// Now cleanup
QStringList *delList = new QStringList(list);
int numObjects = delList->count();
for (int i=0; i < numObjects; i++)
delete (new QString(list.takeAt(0)));
delList->clear();
delete delList;
delList = 0;
delete &list; // <--- Seg fault with this
}
私は、これが正しいとはまったく、あるいはそれに近いとは思いません。リスト内のすべてのアイテムを明示的に削除してから、リスト自体を削除するにはどうすればよいですか?