2013-04-06 13 views
9

Ich habe eine QMap bestehen aus Zeigern auf Klassenobjekte, die mit new zugewiesen. Ich muss alle diese Zeiger löschen. Was ist der richtige Weg, dies mit QMap zu tun? Ich kann es so machen:Löschen aller Werte aus einer QMap

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

Aber gibt es eine bessere Möglichkeit, das gleiche zu tun?

+1

Duplizieren von http://Stackoverflow.com/questions/15727958/delete-pointers-from-a-map/15730555#15730555 –

Antwort

20

Der beste Weg, dies zu tun ist qDeleteAll(...) zu verwenden:

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

qDeleteAll(...) kann auf alle Qt-Container verwendet werden. Auf diese Weise brauchen Sie sich keine Gedanken über eine Schleife zu machen oder sich darum zu kümmern, Elemente einzeln zu löschen.

+0

Ich erkläre eine QMap wie folgt 'QMap list_items;'. Wenn ich 'qDeleteAll (list_items)' 'dann habe ich eine Fehlermeldung erhalten ist' error: type 'const Klasse QString' Argument gegeben zu 'löschen', erwartet Zeiger '. Hast du in diesem Fall eine Idee? –

+3

@TanViet Sie können qDeleteAll verwenden, wenn Sie Zeiger in Ihrer Karte speichern. Sie haben diesen Fehler, weil Sie nach Wert speichern und dann versuchen, es als Zeiger zu löschen. Schau mal hier [link] http://qt-project.org/doc/qt-4.8/qtalgorithms.html#qDeleteAll Ich denke, list_items.clear() wäre in Ihrem Fall genug. – miks131

+0

@ miks131 ist korrekt. Sie müssen nur 'qDeleteAll (...)' verwenden, wenn die Karte Zeiger enthält. Wenn eine Karte gelöscht oder gelöscht wird, verlieren die darin enthaltenen Elemente ihren Gültigkeitsbereich und werden zerstört. Zeiger bleiben jedoch hängen und Sie verlieren Speicher, es sei denn, Sie löschen sie zuerst. Daher ist die typische Strategie, 'qDeleteAll (...)' vor dem Löschen oder Löschen einer Map zu verwenden, wenn die Map Zeiger enthält, die gelöscht werden müssen. Andernfalls ist 'qDeleteAll (...)' nicht notwendig. – Cutterpillow

Verwandte Themen