2013-04-06 72 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

Duplicate http://stackoverflow.com/questions/15727958/delete-pointers-from-a-map/15730555#15730555 – 2013-04-06 13:16:43

回答

20

做到这一点,最好的方法是使用qDeleteAll(...)

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

qDeleteAll(...)可以在所有Qt的容器中。这样你就不必担心循环,也不必担心个别删除项目。

+0

我声明一个QMap就像这样'QMap list_items;'。当我使用'qDeleteAll(list_items)'时,我得到一个错误信息是'error:type'const'QString'参数给'delete',预期的指针。你在这种情况下有什么想法吗? – 2013-09-09 03:38:42

+3

@TanViet 如果您将指针存储在地图中,则可以使用qDeleteAll。你有这个错误,因为你存储的价值,然后试图删除它作为指针。看看这里[链接] http://qt-project.org/doc/qt-4.8/qtalgorithms.html#qDeleteAll 我认为list_items.clear()就足够你的情况。 – miks131 2013-09-12 12:57:52

+0

@ miks131是正确的。当地图包含指针时,您只需使用'qDeleteAll(...)'。当地图被删除或清除时​​,其中的项目将会丢失范围并被销毁,但是指针将会悬空并且会泄漏内存,除非您先删除它们。因此,典型的策略是在清除或删除映射之前使用'qDeleteAll(...)',如果映射包含必须删除的指针。否则'qDeleteAll(...)'是没有必要的。 – Cutterpillow 2013-09-17 04:57:47