代碼 for (int i = 0; i < m_myImageList.GetImageCount(); i++) m_myImageList.Remove(i); 看似合理,實則存在經典邏輯缺陷:Remove(i) 會導致後續圖片索引前移,而循環變量 i 仍遞增,造成跳過圖片甚至越界。
假設初始 5 張圖片(索引 0-4):
i=0:刪除索引 0,原索引 1 變為新索引 0。i=1:刪除新索引 1(原索引 2),原索引 1(現索引 0)被跳過。int count = m_myImageList.GetImageCount();
for (int i = count - 1; i >= 0; --i) {
m_myImageList.Remove(i);
}
逆序遍歷時,刪除當前索引不影響前面待刪除項的索引,確保全部刪除。
若需清空整個圖片列表,直接調用 m_myImageList.DeleteImageList(); 然後重新 Create,或鍵毀對象重建,效率更高且代碼更清晰。
對動態容器進行刪除操作時,優先考慮逆序遍歷,或使用迭代器安全刪除模式(如 C++ STL 的 erase 返回下一個有效迭代器)。MFC 容器無標準迭代器,逆序循環是最穩健選擇。