繁体   English   中英

带矢量的shared_ptr

[英]shared_ptr with vector

我目前有矢量,例如:

vector<MyClass*> MyVector;

我使用

MyVector[i]->MyClass_Function();

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

typedef shared_ptr<MyClass*> safe_myclass

vector<safe_myclass>

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

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

  1. 使用多态类或
  2. 负担不起复制构造函数,或者有您不能复制的原因,并确保编译器不会写出此步骤?

如果是这样,那么共享指针就是要走的路,但是当人们根本无法从中受益时,人们通常会使用这种范例。

为了完整std::vector<MyClass>如果您确实更改为std::vector<MyClass> ,则在代码后来变为多态时,可能要进行一些丑陋的维护,但是理想情况下,您需要做的所有更改就是更改typedef。

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

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

因此,您不仅可以安全地交换共享指针,还可以安全地交换整个向量。 折衷很难输入到需要向量的API中,但是由于它们与可为您的类提供的迭代器一起使用,因此设计不当。

这可能对您的应用程序来说是太多的工作(尽管如果将它公开在面向客户的库中是谨慎的),但这是有效的考虑因素。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM