删除向量中指针的方法 [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
包含大对象,它们将通过引用进行迭代,而无需进行不必要的复制。在我们的例子中这无关紧要,因为可以轻松复制像指针这样的普通类型。
P.S。正如其他人所指出的,在现代 C++ 中,我们尽量避免使用 new
和 delete
,而是使用值语义和智能指针。所以像 std::vector<Circle> circles
这样简单的东西可能就是所需要的,或者如果需要指针,std::vector<std::unique_ptr<Circle>> circles
。在这两种情况下都不需要手动清理。
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
包含大对象,它们将通过引用进行迭代,而无需进行不必要的复制。在我们的例子中这无关紧要,因为可以轻松复制像指针这样的普通类型。
P.S。正如其他人所指出的,在现代 C++ 中,我们尽量避免使用 new
和 delete
,而是使用值语义和智能指针。所以像 std::vector<Circle> circles
这样简单的东西可能就是所需要的,或者如果需要指针,std::vector<std::unique_ptr<Circle>> circles
。在这两种情况下都不需要手动清理。