2013-04-11 124 views
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; 
    } 
} 
+2

你真的需要一个指针的容器吗?你不能将你的'Foo'对象存储为值('std :: vector ')?另外,如果'createFooVector'返回一个新的向量而不是修改一个给定的参数,它不会更清楚吗? – 2013-04-11 07:18:55

+0

@LucTouraille我使用指针,因为这个原因:http://stackoverflow.com/questions/15471193/vector-of-virtual-class-are-pointers-the-clean-way-to-go ...这不可能可以在我在这里展示的代码中看到,尽量保持它最小 – Vince 2013-04-12 00:10:52

回答

3

我建议要么使用boost::pointer_vector,一个std::vector<std::unique_ptr<Foo>>,或推出其持有vector<Foo*>和照顾的缺失在构造自己的Foo管理器类(你应该看到这是“专家”的解决方案,只有尝试它如果你完全理解异常安全)。您不希望手动进行删除,这很容易导致错误。

+0

虽然我不会推荐经理解决方案;很可能OP将不会像例外情况那样安全...... – 2013-04-11 07:41:36

+0

@MatthieuM。非常真实。我加了一个警告。 – juanchopanza 2013-04-11 08:47:31

1

你的代码是正确的。但是,使用智能指针应该是首选(更少的代码编写和更少的内存错误)。

1

会使用智能指针更干净的方式去?

是的。

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

我没有任何想法,为什么有人不希望在C++中使用智能指针,如果它不是功课... 但是,我认为,最好在这种情况下使用类似boost::pointer_containers

1

如果您不使用从Foo派生的类,并且Foo对于复制构建体而言相对便宜,则只需使用vector<Foo>即可。

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

+1

无论构建问题的代价很高,我认为您正在考虑将*拷贝*费用昂贵。尽管有移动语义,但它可能不是什么大问题......如果最坏的情况发生,可以使用新的'emplace_back'成员。 – 2013-04-11 07:43:21

+0

@Matthieu是的,移动语义改变了一切。为了澄清我的意思,为了将值推入矢量中,必须构造它,然后矢量副本构造另一个。我的意思是表明需要考虑到一般价值观的构建。我会更新说'复制构造'。 – 2013-04-11 08:39:45