1

我目前有向量,例如:

vector<MyClass*> MyVector;

我使用

MyVector[i]->MyClass_Function();

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

typedef shared_ptr<MyClass*> safe_myclass

vector<safe_myclass>

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

4

3 回答 3

9

大概只是std::vector<MyClass>。你是

  1. 使用多态类或
  2. 买不起复制构造函数或者有理由不能复制并且确定编译器不会写出这一步?

如果是这样,那么共享指针就是要走的路,但人们通常会使用这种范式,因为它根本没有利于他们。

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

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

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

因此,您不仅可以安全地换出共享指针,还可以换出整个向量。权衡取舍更难输入到需要向量的 API,但这些设计不当,因为它们应该与您可以为您的类提供的迭代器一起使用。

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

于 2012-05-28T20:46:46.677 回答
9

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

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

于 2012-05-28T22:23:02.897 回答
1

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

于 2012-05-29T21:38:04.010 回答