[英]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++ 中,我們嘗試避免使用new
和delete
,而是使用值語義和智能指針。 所以像std::vector<Circle> circles
這樣簡單的東西可能就是所需要的,或者如果需要指針, std::vector<std::unique_ptr<Circle>> circles
。 在這兩種情況下都不需要手動清理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.