2013-04-06 21 views
9

QMapは、クラスオブジェクトへのポインタで構成され、newで割り当てられます。私はこれらのポインタをすべて削除する必要があります。 QMapでこれを行う正しい方法は何ですか?私はこのようにすることができます:QMapからすべての値を削除する

QList<ClassName*> allVals = map.values(); 
for (QList<ClassName*>::iterator it = allVals.begin(), endIt = allVals.end(); it != endIt; ++it) { 
    delete *it; 
} 

しかし、同じことをするより良い方法はありますか?

+1

重複:http://stackoverflow.com/questions/15727958/delete-pointers-from-a-map/15730555#15730555 –

答えて

20

これを行うための最善の方法は、qDeleteAll(...)を使用することです:

qDeleteAll(map); // deletes all the values stored in "map" 
map.clear();  // removes all items from the map 

qDeleteAll(...)は、Qtのコンテナのすべてで使用することができます。こうすることで、ループを心配する必要もなく、項目を個別に削除する心配もありません。

+0

このQMap list_items;のようなQMapを宣言します。 'qDeleteAll(list_items)'を使うとエラーメッセージが出ます。 'error:type' const class QString '引数は' delete '、expected pointer'に与えられます。この場合、アイデアはありますか? –

+3

@TanViet マップにポインタを格納する場合は、qDeleteAllを使用できます。値で格納してポインタとして削除しようとすると、このエラーが発生します。ここを見てください[リンク] http://qt-project.org/doc/qt-4.8/qtalgorithms.html#qDeleteAll あなたのケースではlist_items.clear()で十分でしょう。 – miks131

+0

@ miks131が正しいです。マップにポインタが含まれている場合は、 'qDeleteAll(...)'だけを使う必要があります。マップが削除またはクリアされると、その中のアイテムはスコープを失い、破壊されますが、ポインタはダングリングのままになり、最初に削除しない限り、メモリがリークします。したがって、典型的な戦略は、削除する必要があるポインタがマップに含まれている場合は、マップを消去または削除する前に 'qDeleteAll(...)'を使用することです。それ以外の場合、 'qDeleteAll(...)'は必要ありません。 – Cutterpillow