2016-06-29 191 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

是的。謝謝。 –

相關問題