shared_ptr与矢量

use*_*112 1 c++ boost shared-ptr

我目前有矢量,如:

vector<MyClass*> MyVector;
Run Code Online (Sandbox Code Playgroud)

我访问使用

MyVector[i]->MyClass_Function();
Run Code Online (Sandbox Code Playgroud)

我想利用shared_ptr.这是否意味着我所要做的就是将我vector改为:

typedef shared_ptr<MyClass*> safe_myclass

vector<safe_myclass>
Run Code Online (Sandbox Code Playgroud)

我可以继续使用我之前的其余代码吗?

dje*_*lin 9

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

  1. 使用多态类或
  2. 无法承担复制构造函数或有一个你无法复制的原因,并确保编译器不会写出这一步骤?

如果是这样,那么共享指针就是可行的方法,但是当人们根本不使用它时,人们会使用这种范例.

如果你做了改变就std::vector<MyClass>完成了如果你的代码后来变成多态的话可能会有一些难看的维护,但理想情况下你需要的所有改变都是改变你的typedef.

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

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

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

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


小智 9

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

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

  • @Deqing现在不再是C++ 11了 (4认同)
  • @AJed他们是哪些非确认的C++编译器? (2认同)
  • @AJed冷静下来,这是一个基本的语言功能,在我所知道的6个C++ 11编译器中,你所捍卫的是作者的主观的,未经证实的意见. (2认同)