循环访问映射并删除动态分配的元素
Iterating through a map and deleting an element that was dynamically allocated
这是我的代码:
void SurfaceManager::SurfaceManagerDelete()
{
for(map<string,SurfaceManager*>::iterator Iter = SurfaceList.begin(); Iter != SurfaceList.end(); ++Iter)
{
delete (*Iter).second;
(Iter) = SurfaceList.erase(Iter);
}
SurfaceList.clear();
}
为什么当我使用 VLD 扫描它时,这会导致多个内存泄漏?我知道这与我从元素中删除内存的方式有关,特别是这一行"(Iter) = SurfaceList.erase(Iter);",但是我想知道为什么,以及我应该如何正确删除元素从列表中。
问题是 for 循环中的 ++Iter。那是因为
(Iter) = SurfaceList.erase(Iter);
已经更新 Iter 以指向擦除后的元素,就像增量一样。
因此,++Iter 然后跳过另一个元素,实际上您最终会删除所有其他元素!
您必须注意在正确的迭代器上进行操作。在您的情况下,由于for
循环中的++Iter
,您跳过了一个迭代器,有时最终会在结束迭代器上调用++
。
通常的变异关联容器循环如下所示:
for (auto it = m.cbegin(); it != m.cend() /* not hoisted */; /* no increment */)
{
if (delete_condition)
{
// other stuff, like "delete it->second;"
m.erase(it++);
}
else
{
++it;
}
}
或者,如果要处理整个容器,则根本不要使用erase
:
for (auto & p : m) { delete p.second; }
// or alternatively
for (auto it = m.begin(); it != m.end(); ++it) { delete it->second; }
m.clear();
(我想指出的是,我很少在容器上发现clear()
的用途。通常,在C++中,您会严格限定对象的范围,以便它们只在最短的必要时间内生存,当您需要新地图时,只需创建一个新地图,而不是清除并重复使用寿命太长的地图。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 在c++中使用动态分配的问题
- 访问动态分配列表中的元素
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- c++ 使用动态分配运算符反向数组元素
- 我正在丢失动态分配的数组中的元素
- 通过动态分配插入列表元素
- 使用动态分配创建数组并将元素插入其中
- STL和元素插入中列表的动态分配
- 动态分配的结构阵列具有动态分配的结构阵列元素
- C++如何编写一个函数来检查元素是否存在于动态分配的数组中
- C++如何确定元素是否存在于动态分配的数组中
- 检查动态分配的数组C++中是否存在元素
- 循环访问映射并删除动态分配的元素
- 如何初始化vlaue,并将其逐个元素动态分配给数组
- 如何在不使用std::vectors的情况下,使用运算符==从动态分配的对象数组中删除元素
- 如何从动态分配的数组中删除元素
- 每次在std::list容器中插入元素时,都会执行动态分配
- 将元素推送到动态分配的指针数组int C++