删除指针向量

Deleting vector of pointers

本文关键字:向量 指针 删除      更新时间:2023-10-16

我需要创建类实例的指针,而程序在编译时并不知道我将创建多少个指针。对于删除,我考虑将指针存储在一个向量中,然后逐个删除它们。使用智能指针会是一种更干净的方式吗?如果不想使用智能指针,那么vector的这种用法会被认为是干净的吗?

最低代码:

#include <vector>
using namespace std;
class Foo {
public:
    Foo();
};
Foo::Foo(){}
void createFooVector(int nb, std::vector<Foo*> &v){
    for(int i=0;i<nb;i++){
        Foo* f = new Foo();
        v.push_back(f);
    }
}
int main(int argc, char *argv[]){
    std::vector<Foo*> v;
    createFooVector(5,v); 
    while (!v.empty()){
        Foo* f = v.back();
        v.pop_back();
        delete f;
    }
}

我建议使用boost::pointer_vector,一个std::vector<std::unique_ptr<Foo>>,或者推出你自己的Foo管理器类,它包含一个vector<Foo*>,并在构造函数中负责删除(你应该把这看作是"专家"解决方案,只有在你完全理解异常安全的情况下才尝试它)。您不希望手动删除,因为这很容易导致错误。

您的代码很好。然而,使用智能指针应该是首选(更少的代码编写和更少的内存错误的机会)。

使用智能指针会是一个更简洁的方法吗?

是的。

如果不想使用智能指针,会使用载体被认为是干净的吗?

我不知道,为什么有人不想在c++中使用智能指针,如果它不是家庭作业…但是,我认为,在这种情况下,最好使用boost::pointer_containers

如果您不使用从Foo派生的类,并且复制Foo相对便宜,则只需使用vector<Foo>

如果你的编译器支持移动语义,应该不会有问题。