shared_ptr与矢量

时间:2012-05-28 20:34:48

标签: c++ boost shared-ptr

我目前有以下载体:

vector<MyClass*> MyVector;

我使用

访问
MyVector[i]->MyClass_Function();

我想使用shared_ptr。这是否意味着我要做的就是将我的vector改为:

typedef shared_ptr<MyClass*> safe_myclass

vector<safe_myclass>

我可以像往常一样继续使用我的其余代码吗?

3 个答案:

答案 0 :(得分:9)

可能只是std::vector<MyClass>。你是

吗?
  1. 使用多态类或
  2. 买不起复制构造函数或者有理由无法复制,并且确定编译器没有写出这一步骤?
  3. 如果是这样,那么共享指针是可行的方法,但是当人们根本不使用它时,人们会使用这种范例。

    要完成更改为std::vector<MyClass>,如果您的代码稍后变为多态,则可能需要进行一些难看的维护,但理想情况下,您需要的所有更改都是更改typedef。

    在这一点上,包装整个 std :: vector可能是有意义的。

    class MyClassCollection {
         private : std::vector<MyClass> collection;
         public  : MyClass& at(int idx);
         //...
     };
    

    因此,您不仅可以安全地更换共享指针,还可以更换整个矢量。权衡更难以输入到期望向量的API,但那些设计不合理,因为它们应该与您可以为您的类提供的迭代器一起使用。

    可能这对你的应用程序来说太多了(虽然如果它会在面向客户的库中公开会是谨慎的)但这些都是有效的考虑因素。

答案 1 :(得分:9)

vector<shared_ptr<MyClass>> MyVector;应该没问题。

但如果MyClass的实例未在向量之外共享,并且您使用的是现代C ++ 11编译器,则vector<unique_ptr<MyClass>>shared_ptr更有效(因为{{1} }}没有unique_ptr)的引用计数开销。

答案 2 :(得分:1)

不要立即跳转到共享指针。如果您需要避免复制对象,则可能更适合使用简单的pointer container