2013-04-06 2 views
9

J'ai un QMap composé de pointeurs vers des objets de classe, alloués en utilisant new. J'ai besoin de supprimer tous ces pointeurs. Quelle est la bonne façon de faire cela avec QMap? Je peux le faire de cette façon:Suppression de toutes les valeurs d'un QMap

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

Mais y a-t-il une meilleure façon de faire la même chose?

+1

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

Répondre

20

La meilleure façon de le faire est d'utiliser qDeleteAll(...):

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

qDeleteAll(...) peut être utilisé sur tous les conteneurs de Qt. De cette façon, vous n'avez pas besoin de vous soucier d'une boucle ni de supprimer des éléments individuellement.

+0

Je déclare un QMap comme ceci 'QMap list_items;'. Quand j'utilise 'qDeleteAll (list_items)' alors j'ai un message d'erreur 'error: type 'const class QString' argument donné à 'delete', pointeur attendu'. Avez-vous une idée dans ce cas? –

+3

@TanViet Vous pouvez utiliser qDeleteAll si vous stockez des pointeurs dans votre carte. Vous avez cette erreur car vous stockez par valeur, puis essayez de le supprimer en tant que pointeur. Jetez un oeil ici [link] http://qt-project.org/doc/qt-4.8/qtalgorithms.html#qDeleteAll Je pense que list_items.clear() suffirait dans votre cas. – miks131

+0

@ miks131 est correct. Vous n'avez besoin d'utiliser 'qDeleteAll (...)' que lorsque la map contient des pointeurs. Lorsqu'une carte est supprimée ou effacée, les objets qu'elle contient perdent leur portée et sont détruits, mais les pointeurs resteront suspendus et vous perdrez de la mémoire si vous ne les supprimez pas en premier. La stratégie typique consiste donc à utiliser 'qDeleteAll (...)' avant d'effacer ou de supprimer une map si la map contient des pointeurs à supprimer. Autrement 'qDeleteAll (...)' n'est pas nécessaire. – Cutterpillow

Questions connexes