0

我试图从映射中删除指针元素(映射中的值是一个指针),我在这里看到了代码在 VS、UNIX/Linux 中擦除 STL 迭代器后会发生什么情况?

for(map<T, S*>::iterator it = T2pS.begin(); it != T2pS.end(); T2pS.erase(it++)) {
    // wilhelmtell in the comments is right: no need to check for NULL. 
    // delete of a NULL pointer is a no-op.
    if(it->second != NULL) {
        delete it->second;
        it->second = NULL;
    }
}

我不确定“删除它->秒”是否取消分配正确的内存,因为擦除(it++)步骤已经将迭代器移动到下一个对象。当它到达 delete 语句时,它指向下一个我们不想删除的元素。我错过了什么吗?

4

2 回答 2

2

我相信这会按预期工作。

循环的第三部分for(迭代器被擦除然后递增)在第一次迭代之后执行,对于每个相关的迭代,依此类推。因此,您总是在删除循环内容中已经“处理”过的元素。

一个平行的例子:

for (int i = 0; i < 1; ++i) { ...

i = 0在递增i和检查循环条件之前,您仍将进入循环并执行 with 。

于 2013-04-04T03:18:56.047 回答
1

您可能想尝试另一种方式:

while (T2pS.size() > 0) {
  if (T2pS.begin()->second != NULL) {
    delete T2pS.begin()->second;
  }
  T2pS.erase(T2pS.begin());
}
于 2013-04-04T03:58:22.623 回答