2016-06-29 56 views
0

我的问题是:当我使用基于范围的循环,就像在这个例子中,是否释放了存储在'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; 
+0

这不是你如何清理矢量。它有它自己的机制。你真的需要一个指针向量吗?使用RAII –

+0

如果您使用的是对象而不是指针,一旦矢量超出范围,它们将自动清除,或者您调用矢量的清空功能 –

+2

您的代码对我来说看起来不错。从文体角度来看,我宁愿使用'{delete obj; obj = nullptr; }'。 –

回答

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

这应该工作。

+1

'pt = nullptr;'部分没有任何用处。 –

+0

它不会自动设置为nullptr(根据我的说法,它不是C++标准的一部分),并且它从不是一个好主意,它具有指向内存的非空指针向量,该内存已被清除并可以被其他位代码。 – cplusplusrat

+0

所有的都是true,但你要为'nullptr'设置一个函数局部变量,'vec'仍然包含'delete'd指针。 –

3

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

是的。

我有一个想法,这只是复制一个指针,然后试图释放复制的指针。

它不复制指针。但是,删除指针的副本与删除指针的操作完全相同,因此对于指向的对象是否被销毁没有任何影响。它在删除后的赋值中是否将原始指针设置为空有所不同。

相信“自动* & OBJ:VEC”被宣布“OBJ”为指针的参考,然后分配存储在“VEC”到它的每个对象,其它的存储器将被释放的地址,并设置为nullptr。这是正确的吗?

这大部分是正确的。尽管如果我们是迂腐的,那么代码会将存储在vec中的每个对象分配给引用。这是因为存储在vec中的对象是Object实例的地址。

您需要澄清代码的含义,这意味着它不是很好。在这种情况下,您可能会受益于不使用auto

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

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

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

更清晰了,不是吗?

+0

是的。谢谢。 –