我需要创建一个类实例的指针,程序在编译时不知道我将创建多少指针。 为了删除,我正在考虑将指针存储在一个向量中,然后逐个删除它们。 智能指针的使用会更清晰吗? 如果一个人不想使用智能指针,那么这种向量的使用会被认为是干净的吗?
最低代码:
#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;
}
}
答案 0 :(得分:3)
我建议您使用boost::pointer_vector,std::vector<std::unique_ptr<Foo>>
或推出自己的Foo
经理类,其中包含vector<Foo*>
并负责构造函数中的删除操作(您应该将此视为“专家”解决方案,并且只有在您完全理解异常安全时才尝试它)。您不希望手动删除,这很容易导致错误。
答案 1 :(得分:1)
你的代码很好。但是,使用智能指针应该是首选(编写的代码更少,内存错误的机会更少)。
答案 2 :(得分:1)
智能指针的使用会更清晰吗?
是
如果一个人不想使用智能指针,那会使用吗? 矢量被认为是干净的?
我没有想法,为什么有人不想在C ++中使用智能指针,如果它不是作业......
但是,我认为,在这种情况下使用类似boost::pointer_containers
的东西会更好。
答案 3 :(得分:1)
如果您没有使用从Foo
派生的类,并且Foo
复制构造相对便宜,请使用vector<Foo>
。
如果您的编译器支持移动语义,则不应存在问题。