基于范围的循环

时间:2016-06-29 04:43:37

标签: c++ for-loop heap

我的问题是:当我在这个例子中使用基于范围的循环时,是否在'vec'中存储的每个'Object'中释放堆上的内存?我想到这只是复制一个指针,然后尝试释放复制的指针。

我相信'auto *& obj:vec'声明'obj'是对指针的引用,然后将存储在'vec'中的每个对象的地址分配给它,其内存将被释放,并设置为nullptr。这是对的吗?

std::vector <Object*> vec;
vec.push_back(new Object{});
vec.push_back(new Object{});
//....

//clean up
for(auto *& obj : vec)
    delete obj, obj = nullptr;

2 个答案:

答案 0 :(得分:3)

  

当我在这个例子中使用基于for循环的范围时,是否在'vec'中存储的每个'Object'中释放堆中的内存?

  

我原以为这只是复制一个指针,然后试图释放复制的指针。

它不会复制指针。但是,删除指针的副本与删除指针的功能相同,因此对于指向的对象是否被销毁没有任何区别。在删除后,在赋值中是否将原始指针设置为null确实有所不同。

  

我相信'auto *&amp; obj:vec'声明'obj'是对指针的引用,然后将存储在'vec'中的每个对象的地址分配给它,其内存将被释放,并设置为nullptr。这是对的吗?

这大多是正确的。虽然,如果我们迂腐,该代码会将vec中存储的每个对象分配给引用。这是因为vec中存储的对象是Object个实例的地址。

您需要澄清代码的作用,这意味着它不是很好。在这种情况下,您可以从不使用auto

中受益
for(Object*& obj : vec) {
    delete obj;
    obj = nullptr;
}

另外,考虑存储空指针向量是否有意义。我建议你不要将指针设置为null,而只是完全删除指针:

for(Object* obj : vec)
    delete obj;
vec.clear();

更清楚,不是吗?

答案 1 :(得分:2)

std::for_each(vec.begin(), vec.end(), [](Object* pt){delete pt; pt = nullptr;});

这应该有用。