8

(QObject から継承された) クラスのポインタを QList に挿入する必要があります。次の構文を使用できることを知っています。

.h

QList<MyObject*> list;

.cpp

list.append(new MyObject("first", 1));
list.append(new MyObject("second", 2));
...

次に、メモリを解放します。

if(!list.isEmpty())
{
    qDeleteAll(list);
    list.clear();
}

これは有効である必要があり、メモリ リークは発生しません (私の知る限り)。ただし、オブジェクトをコレクションに追加する前に、オブジェクトを初期化する必要があります。次のコードは、メモリ リークやダングリング ポインターなどのエラーを引き起こす可能性がありますか (上記と同じ方法でポインターを削除します)。

MyObject *obj;

for(i = 0; i < 5; i++)
{   
    obj = new MyObject();
    if(!obj.Init(i, map.values(i)))
    {
        // handle error
    }
    else
    {
        list.append(obj);
    }
}

ありがとう。

4

4 に答える 4

5

「// ハンドル エラー」の場合に「obj」(割り当てられているが初期化されていないインスタンス) を処理すれば、コードは問題ありません。

于 2010-07-15T10:18:28.360 に答える
0

QScopedPointerを使用できます..

Qt 4.6のドキュメントから、

QScopedPointer クラスは、動的に割り当てられたオブジェクトへのポインターを格納し、破棄時にそれを削除します。ヒープに割り当てられたオブジェクトを手動で管理するのは難しく、エラーが発生しやすく、一般的な結果としてコードがメモリ リークを起こし、保守が困難になります。QScopedPointer は、スタックベースのメモリ所有権をヒープ割り当てに割り当てることでこれを大幅に簡素化する小さなユーティリティ クラスです。より一般的には、リソースの取得は初期化 (RAII)と呼ばれます。

それが役に立てば幸い..

編集:

例えば、

あなたが使用する、

QScopedPointer<QWidget> p(new QWidget());

それ以外の

QWidget *p = new QWidget();

メモリ リークダングリング ポインタを気にせずに を追加QScopedPointerします。QList

于 2010-07-15T11:26:23.487 に答える
0

RAII (リソース割り当ては初期化) を使用します。コンストラクターでオブジェクトを直接初期化します。

コードは次のようになります。

for(i = 0; i < 5; i++)
{   
    list.append( new MyObject( i, map.values(i)));
    // In case of initialization failure, throw exception from the constructor
}
于 2010-07-15T10:16:09.613 に答える