c++ - 迭代时从 vector 和内存中删除一个对象

标签 c++ c++11 iterator

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

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

可以吗?或者它通过同时应用删除和删除来跳跃 2 个位置?

最佳答案

循环不正确,因为

  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();

关于c++ - 迭代时从 vector 和内存中删除一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53146458/

相关文章:

c++ - 如何确保无法重入访问我的主 STA COM 服务器 (C++)?

c++ - std::memory_order_relaxed 相对于相同原子变量的原子性

c++ - 如果 volatile 是不必要的,为什么 std::atomic 方法提供 volatile 重载?

c++ - 如何迭代修改后的 std::map 值?

c++ - 如何计算 std::vector<int>::iterator 和 std::vector<int>::reverse_iterator 之间的距离?

c++ - 在 3D 坐标系中查找矩形中的角度点

c++ - 如何将 unique_ptr 与 std::copy 一起使用?

c++ - isspace 和 Replace() 的问题

c++ - 默认情况下是否继承构造函数 noexcept(true)?

c++ - 过滤模板函数的特定迭代器