Удаление всех значений из QMap

У меня QMap состоит из указателей на объекты класса, выделенных с помощью new. Мне нужно удалить все эти указатели. Как правильно это сделать с помощью QMap? Я могу сделать это так:

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

Но есть ли лучший способ сделать то же самое?


person Littlebitter    schedule 06.04.2013    source источник
comment
Дубликат stackoverflow.com/questions/15727958 / delete-pointer-from-a-map /   -  person    schedule 06.04.2013


Ответы (1)


Лучший способ сделать это - использовать qDeleteAll (...) :

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

qDeleteAll(...) можно использовать во всех контейнерах Qt. Таким образом, вам не нужно беспокоиться ни о цикле, ни об удалении элементов по отдельности.

person Cutterpillow    schedule 06.04.2013
comment
Я объявляю QMap вот так QMap<int, QString> list_items;. Когда я использую qDeleteAll(list_items), я получаю сообщение об ошибке error: type 'const class QString' argument given to 'delete', expected pointer. У вас есть идея на этот счет? - person Tan Viet; 09.09.2013
comment
@ miks131 правильный. Вам нужно использовать qDeleteAll(…) только тогда, когда карта содержит указатели. Когда карта удаляется или очищается, элементы внутри нее теряют область видимости и будут уничтожены, но указатели останутся висящими, и у вас будет утечка памяти, если вы сначала не удалите их. Таким образом, типичная стратегия - использовать qDeleteAll(…) перед очисткой или удалением карты, если карта содержит указатели, которые необходимо удалить. В противном случае qDeleteAll(…) не нужно. - person Cutterpillow; 17.09.2013
comment
Если ваши ключи также являются указателями, qDeleteAll удалит ли их? - person Kvass; 14.10.2014