0

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

}

私は、これが正しいとはまったく、あるいはそれに近いとは思いません。リスト内のすべてのアイテムを明示的に削除してから、リスト自体を削除するにはどうすればよいですか?

4

1 に答える 1

5

あなたQStringList listは関数の最後に自動的に削除されます。ここでポインタを削除することを心配する必要はありません。

同様に、

QStringList *delList = new QStringList(list);

する必要があります

QStringList delList = QStringList(list);

さらに良いことに:

QStringList delList = list;

自動ストレージと RAII について読む必要があります。あなたのコードでは、newdeleteは不要です。

リスト内の要素を削除するには、removeAtを使用します。これは削除とは関係ありません。

また、C++ を続ける前に、良い本を手に入れることをお勧めします。

于 2012-10-30T20:58:01.027 に答える