【问题标题】:delete an object both from vector and memory while iterating迭代时从向量和内存中删除一个对象
【发布时间】:2018-11-04 23:19:24
【问题描述】:

我尝试使用其析构函数从对象向量和内存中删除一个对象。我理解删除迭代器指向的对象是使迭代器指向删除的最后一个元素之后的元素。因此,我尝试实现这一点:

std::vector<Customer*>::iterator j=customersList.begin();
while (j!=customersList.end()){
    customersList.erase(j);
    delete  *j;
}

可以吗?或者它通过应用擦除和删除来跳跃2个地方?

【问题讨论】:

  • 你为什么首先使用指针? std::vector 为您在堆上分配内存,您不必将该功能加倍。
  • 您的循环不正确。要退出循环,j 必须是 customersList.end(),这意味着您只是在循环的最后一次迭代中取消引用了一个越过容器末尾的迭代器(并试图 delete 无效指针)。
  • 它跳了 2 个地方 -- 你说的“跳了 2 个地方”是什么意思?
  • @Mr.OY -- 您确实看到您的代码未能检索到erase 的返回值?也许您错过了答案中非常重要的部分。
  • @Mr.OY 根本不是这么说的。你在哪里看到的?

标签: c++ c++11 iterator


【解决方案1】:

循环不正确,因为

  1. 您正在使 j 迭代器无效,然后在取消引用的无效迭代器上发出 delete 调用。

  2. j 迭代器在该循环中根本不递增。

发出delete 和擦除的最简单方法是简单的std::for_each,然后是vector::clear()

#include <algorithm>
//...
std::for_each(std::begin(customersList), std::end(customersList), [](Customer *c){delete c;});
customersList.clear();

甚至简单地说:

for (Customer* c : customersList )
    delete c;
customersList.clear();

【讨论】:

  • 我认为普通的for 循环更容易:for (Customer *c : customersList) { delete c; }
  • 好的,在理解你的代码之后,我搜索了一些替代方案,请告诉我它们是否可以:首先使用:for ( it = customersList.begin(); it != customersList.end(); ) delete * it; it = customersList.erase(it); } 这是基于这个答案:stackoverflow.com/a/991354/ 9820561 第二次尝试使用 while:std::vector&lt;Customer*&gt;::iterator j=customersList.begin(); while (j!=customersList.end()){ delete *j; j=customersList.erase(j); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 2020-06-22
相关资源
最近更新 更多