9

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

最低代码:

#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;
    }
}
4

4 回答 4

3

我建议要么使用boost::pointer_vector、 an std::vector<std::unique_ptr<Foo>>,要么推出你自己的Foo管理器类,它包含 avector<Foo*>并负责在构造函数中删除(你应该将其视为“专家”解决方案,并且只有在你完全了解异常安全)。您不想手动删除,这很容易导致错误。

于 2013-04-11T07:14:03.880 回答
1

你的代码很好。但是,使用智能指针应该是首选(要编写的代码更少,内存错误的机会也更少)。

于 2013-04-11T07:13:02.023 回答
1

使用智能指针会更清洁吗?

是的。

如果不想使用智能指针,向量的这种使用会被认为是干净的吗?

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

于 2013-04-11T07:14:02.037 回答
1

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

如果您的编译器支持移动语义,则应该没有问题。

于 2013-04-11T07:23:21.313 回答