簡體   English   中英

刪除向量中指針的方法 [C++]

[英]Ways of deleting pointers in a vector [C++ ]

std::vector<Circle*> circles

for(int i=0; i<circles.size(); i++)    // 1
    delete circles[i];

for(auto & circle : circles)           // 2
    delete circle;

for(Circle * circle : circles)         // 3
    delete circle;

 for(Circle *& circle : circles){      // 4
    delete circle;

如果我用第一種方式寫,CLion IDE 建議我使用第二種方式,所以我猜它們是一樣的。 我不太確定為什么 auto 旁邊有一個引用,以及方法 3 或 4 中的任何一個是否也正確? 我猜 4 也與 1 和 2 相同。

為了完整起見,還有另一種方法:

for(auto circle : circles)
    delete circle;

現在,此示例中的所有這些方式都是等效的,並且同樣可以很好地完成刪除circles元素的工作。

對指針的引用無關緊要(引用在表達式中“展開” - 用技術術語來說是左值到右值的轉換),在所有情況下,實際的指針值都會傳遞給delete

IDE 似乎暗示了編寫基於范圍的 for 循環的最慣用方式:

for(auto & elem : collection)

這通常是最安全的形式; 這樣,如果collection包含大對象,它們將通過引用進行迭代,而無需不必要的復制。 在我們的例子中這並不重要,因為像指針這樣的普通類型可以很容易地復制。


PS 正如其他人所指出的,在現代 C++ 中,我們嘗試避免使用newdelete ,而是使用值語義和智能指針。 所以像std::vector<Circle> circles這樣簡單的東西可能就是所需要的,或者如果需要指針, std::vector<std::unique_ptr<Circle>> circles 在這兩種情況下都不需要手動清理。

暫無
暫無

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

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