【问题标题】:Ways of deleting pointers in a vector [C++ ]删除向量中指针的方法 [C++]
【发布时间】:2021-06-14 05:15:43
【问题描述】:
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 相同。

【问题讨论】:

  • FWIW,如果你使用std::vector&lt;std::unique_ptr&lt;Circle&gt;&gt; circles,你不需要写任何清理代码。
  • 4 与 2 相同,3 与使用 auto 没有 & 相同
  • 4 种方法都是正确的。这是您问题的答案吗?

标签: c++ pointers vector reference


【解决方案1】:

为了完整起见,还有一种方法:

for(auto circle : circles)
    delete circle;

现在,所有本示例中的这些方法都是等效的,并且同样可以很好地删除 circles 元素。

对指针的引用无关紧要(引用在表达式中“展开” - 用技术术语来说是左值到右值的转换),在所有情况下,实际指针值都会传递给delete

IDE 似乎建议使用最惯用的方式来编写基于范围的 for 循环:

for(auto & elem : collection)

这通常是最安全的形式;这样,如果collection 包含大对象,它们将通过引用进行迭代,而不会进行不必要的复制。在我们的例子中这无关紧要,因为像指针这样的普通类型可以很容易地复制。


附:正如其他人所指出的,在现代 C++ 中,我们尝试避免使用 newdelete,而是使用值语义和智能指针。所以像std::vector&lt;Circle&gt; circles 这样简单的东西可能就足够了,或者如果需要指针,std::vector&lt;std::unique_ptr&lt;Circle&gt;&gt; circles。在这两种情况下都不需要手动清理。

【讨论】:

    猜你喜欢
    • 2021-05-05
    • 1970-01-01
    • 2020-06-24
    • 2013-07-02
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多