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