与载体shared_ptr的(shared_ptr with vector)

2019-06-24 21:56发布

我现在有载体,如:

vector<MyClass*> MyVector;

我访问使用

MyVector[i]->MyClass_Function();

我想利用shared_ptr 。 这是否意味着所有我需要做的就是改变我的vector到:

typedef shared_ptr<MyClass*> safe_myclass

vector<safe_myclass>

我可以继续使用我的代码的其余部分,因为它以前?

Answer 1:

vector<shared_ptr<MyClass>> MyVector; 应该可以。

但是,如果的实例MyClass不载体外共享,并且使用现代C ++编译器11, vector<unique_ptr<MyClass>>是比更有效shared_ptr (因为unique_ptr不具有的引用计数开销shared_ptr ) 。



Answer 2:

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

  1. 多态类或工作
  2. 买不起的拷贝构造函数或有不能复制并确信这一步没有得到由编译器写出一个原因吗?

如果是这样那么共享指针是要走的路,但往往人们用这种模式时,它并没有将它们都受益。

是完整的,如果你不改变std::vector<MyClass>你可能有一些丑陋的保养做,如果你的代码以后成为多态的,但最好你需要的所有的变化是改变你的typedef。

除了这一点,它可能是有意义的包装你的整个的std ::向量。

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

所以,你可以放心地换出,不仅共享指针,但整个向量。 权衡是很难输入到期望的向量的API,但这些都是设计不当的,因为他们应该与迭代器,你可以为你的班上做。

可能这是你的应用程序的工作太多了,但这些都是有效的考虑(虽然如果它要在客户面临的一个库被暴露要谨慎)。



Answer 3:

不要马上到共享指针。 你可能会更适合用一个简单的指针容器 ,如果你需要避免复制对象。



文章来源: shared_ptr with vector