我目前有以下载体:
vector<MyClass*> MyVector;
我使用
访问MyVector[i]->MyClass_Function();
我想使用shared_ptr
。这是否意味着我要做的就是将我的vector
改为:
typedef shared_ptr<MyClass*> safe_myclass
vector<safe_myclass>
我可以像往常一样继续使用我的其余代码吗?
答案 0 :(得分:9)
可能只是std::vector<MyClass>
。你是
如果是这样,那么共享指针是可行的方法,但是当人们根本不使用它时,人们会使用这种范例。
要完成更改为std::vector<MyClass>
,如果您的代码稍后变为多态,则可能需要进行一些难看的维护,但理想情况下,您需要的所有更改都是更改typedef。
在这一点上,包装整个 std :: vector可能是有意义的。
class MyClassCollection {
private : std::vector<MyClass> collection;
public : MyClass& at(int idx);
//...
};
因此,您不仅可以安全地更换共享指针,还可以更换整个矢量。权衡更难以输入到期望向量的API,但那些设计不合理,因为它们应该与您可以为您的类提供的迭代器一起使用。
可能这对你的应用程序来说太多了(虽然如果它会在面向客户的库中公开会是谨慎的)但这些都是有效的考虑因素。
答案 1 :(得分:9)
vector<shared_ptr<MyClass>> MyVector;
应该没问题。
但如果MyClass
的实例未在向量之外共享,并且您使用的是现代C ++ 11编译器,则vector<unique_ptr<MyClass>>
比shared_ptr
更有效(因为{{1} }}没有unique_ptr
)的引用计数开销。
答案 2 :(得分:1)
不要立即跳转到共享指针。如果您需要避免复制对象,则可能更适合使用简单的pointer container。