在这种情况下,我应该使用指针向量吗?

在这种情况下,我应该使用指针向量吗?

问题描述:

我想知道在下面的例子中使用指针矢量的优点是什么。在内存管理方面,这三个向量之间是否有区别?哪一个最有效?在这种情况下,我应该使用指针向量吗?

class foo{ 
    public: 
     foo(int a); 
    private: 
     int x; 
}; 

foo::foo(int a){ 
} 

int main() { 
    std::vector< std::shared_ptr<foo> > vec = 
     {std::make_shared<foo>(2), std::make_shared<foo>(2)}; 
    std::vector<foo*> vec2 = {new foo(2), new foo(2)}; 
    foo o1(2), o2(2); 
    std::vector<foo> vec3 = {o1, o2}; 
    return 0; 
} 
+1

为什么不'std :: vector vec3 = {foo {2},foo {2}};'?保持一致。 – 2014-12-06 20:35:40

根据您当前的例子,我要说的是,std::vector<foo>是你最好的选择。

std::vector< std::shared_ptr<foo> > vec = 
    {std::make_shared<foo>(2), std::make_shared<foo>(2)}; 

使用shared_ptr将通过存储引用计数来处理内存管理。当没有更多的对象引用时,对象将被销毁。


std::vector<foo*> vec2 = {new foo(2), new foo(2)}; 
foo o1(2), o2(2); 
std::vector<foo> vec3 = {o1, o2}; 

普通整数和指针是相同的大小,以便在你的Foo类一个整型,唯一的区别是内存泄漏的可能性,如果你忘记删除指针。

如果另一个指针正在使用foo对象并尝试使用它,则删除一个指针也会创建异常。


如果你需要指针,智能指针通常是最好的选择,因为它们的内存管理。

一般来说,我会考虑使用指针的矢量,如果:

  1. 在载体中的对象(或对象的部分)的寿命时间是比所述载体本身

    的寿命时间大
  2. 您依赖多态性和动态分派。然后,你必须指针的基类的载体中,与指针派生类填充它,然后通过虚拟函数做一些

共用指针具有基准计数器,所以它是稍大,但有点更安全。通常的指针,只要你一定要破坏在适当和及时

否则对象是确定的,这是很难告诉你的要求是