簡體   English   中英

基於范圍的循環

[英]Range Based For Loop

我的問題是:當像本例中那樣使用基於范圍的for循環時,它是否釋放存儲在“ vec”中的每個“對象”中堆上的內存? 我認為這只是復制一個指針,然后嘗試釋放復制的指針。

我相信'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;

當我在本示例中使用基於范圍的for循環時,它是否釋放存儲在“ vec”中的每個“對象”中堆上的內存?

是。

我認為這只是復制一個指針,然后嘗試釋放復制的指針。

它不復制指針。 但是,刪除指針的副本與刪除指針具有相同的作用,因此對於所指向的對象是否被破壞沒有任何區別。 刪除后在分配中原始指針是否設置為null確實有所不同。

我相信'auto *&obj:vec'聲明'obj'是對指針的引用,然后將存儲在'vec'中的每個對象的地址分配給它,該對象的內存將被釋放,並設置為nullptr。 這是正確的嗎?

這基本上是對的。 雖然,如果我們是書呆子,該代碼會將存儲在vec中的每個對象分配給引用。 這是因為存儲在vec中的ObjectObject實例的地址。

您需要弄清楚代碼的作用意味着它不是很好。 在這種情況下,您可能會受益於不使用auto

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

此外,請考慮存儲空指針向量是否有意義。 我建議您不要將指針設置為null,而只需完全刪除指針即可:

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

更清楚了,不是嗎?

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

這應該工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM