【问题标题】:deallocating memory in a map with pointers使用指针在映射中释放内存
【发布时间】:2013-04-04 03:14:02
【问题描述】:

我试图从地图中删除指针元素(地图中的值是指针),我在这里看到了代码What happens to an STL iterator after erasing it in VS, UNIX/Linux?

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;
    }
}

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

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    我相信这会按预期工作。

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

    一个平行的例子:

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

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

    【讨论】:

    • 感谢 aardvarkk。我也可以对向量使用类似的代码吗?
    • @vkaul11 是的,我相信矢量容器应该以类似的方式运行。
    【解决方案2】:

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

    while (T2pS.size() > 0) {
      if (T2pS.begin()->second != NULL) {
        delete T2pS.begin()->second;
      }
      T2pS.erase(T2pS.begin());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      • 2014-02-15
      相关资源
      最近更新 更多