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