我目前有向量,例如:
vector<MyClass*> MyVector;
我使用
MyVector[i]->MyClass_Function();
我想利用shared_ptr
. 这是否意味着我所要做的就是将我的更改vector
为:
typedef shared_ptr<MyClass*> safe_myclass
vector<safe_myclass>
我可以像以前一样继续使用我的其余代码吗?
我目前有向量,例如:
vector<MyClass*> MyVector;
我使用
MyVector[i]->MyClass_Function();
我想利用shared_ptr
. 这是否意味着我所要做的就是将我的更改vector
为:
typedef shared_ptr<MyClass*> safe_myclass
vector<safe_myclass>
我可以像以前一样继续使用我的其余代码吗?
大概只是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
)更有效。
不要立即跳转到共享指针。如果您需要避免复制对象,您可能更适合使用简单的指针容器。