2013-04-06 12 views
9

Ho un QMap costituito da puntatori agli oggetti di classe, assegnati utilizzando new. Devo cancellare tutti questi suggerimenti. Qual è il modo corretto di farlo con QMap? Posso farlo in questo modo:Eliminazione di tutti i valori da una QMap

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

Ma c'è un modo migliore di fare lo stesso?

+1

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

risposta

20

Il modo migliore per farlo è quello di utilizzare qDeleteAll(...):

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

qDeleteAll(...) può essere utilizzato su tutti i contenitori di Qt. In questo modo non devi preoccuparti di un ciclo né preoccuparti dell'eliminazione degli elementi individualmente.

+0

Dichiaro un QMap come questo 'QMap list_items;'. Quando uso 'qDeleteAll (list_items)' allora ho ricevuto un messaggio di errore 'error: tipo 'const class QString' argomento dato a 'delete', pointer atteso'. Hai un'idea in questo caso? –

+3

@TanViet È possibile utilizzare qDeleteAll se si memorizzano i puntatori nella mappa. Si dispone di questo errore perché si archivia per valore e quindi si tenta di eliminarlo come puntatore. Date un'occhiata qui [link] http://qt-project.org/doc/qt-4.8/qtalgorithms.html#qDeleteAll Penso che list_items.clear() sarebbe abbastanza nel tuo caso. – miks131

+0

@ miks131 è corretto. Devi solo usare 'qDeleteAll (...)' quando la mappa contiene dei puntatori. Quando una mappa viene cancellata o cancellata, gli oggetti al suo interno perderanno l'ambito e saranno distrutti, ma i puntatori verranno lasciati a penzoloni e perderai memoria se non li elimini prima. Quindi la strategia tipica è usare 'qDeleteAll (...)' prima di cancellare o eliminare una mappa se la mappa contiene dei puntatori che devono essere cancellati. Altrimenti 'qDeleteAll (...)' non è necessario. – Cutterpillow

Problemi correlati