处理std :: tr1 :: shared_ptr的向量的约定

时间:2013-09-03 23:01:22

标签: c++ c++11 shared-ptr smart-pointers tr1

我已经开始使用std :: tr1 :: shared_ptr了,到目前为止我非常喜欢它。我理解一些陷阱(例如,两个包含智能指针成员的分类)。但还有其他一些情况我不确定是否使用智能指针。

E.g。

class Scene;
typedef shared_ptr<Scene> ScenePtr;

Class SceneManager {
public:

   int size() { return _scenes.size(); }
   ScenePtr scene(int i) { return _scenes[i]; }

private:
   vector<ScenePtr> _scenes;
}

这一切都很好并且运作良好。但是,如果我有一个外部控制器,是否有任何不利之处:

for(int i=0; i<_sceneManager->size(); i++) {
   ScenePtr scene = _sceneManager->scene(i);
   scene->doSomething();
}

这里'scene'显然会增加每个ScenePtr的引用计数,但是当它超出范围时再次减少它。但是有任何表现(或任何其他)缺点吗?

或者我可以使用普通的C指针

for(int i=0; i<_sceneManager->size(); i++) {
   Scene* scene = _sceneManager->scene(i).get();
   scene->doSomething();
}

但这实际上更好吗?还是相同?引用计数是否会增加? (在函数调用上),但是一旦离开第一行就会减少?

我经常使用参考文献,会有任何复杂情况吗?

for(int i=0; i<_sceneManager->size(); i++) {
   Scene& scene = *_sceneManager->scene(i);
   scene.doSomething();
}

最后,返回一个ScenePtr是一个好主意,还是SceneManager :: scene(i)返回一个(Scene *)或者甚至(Scene&amp;)?

同样,要做一个我经常使用的有序地图: vector _scenesArray; map _scenesMap;

所以我可以按名称或按顺序访问对象。使用std :: tr1 :: shared_ptr它们都应该是ScenePtr吗?或者只是其中一个ScenePtr和另一个Scene *?

1 个答案:

答案 0 :(得分:0)

这一切都取决于用例。

因为您怀疑使用指针或引用将节省引用计数开销。

...但是......通常开销不足以担心并且:

如果在多个线程中使用sceneManager或者此函数需要重新安全,则可能首选通过共享指针访问的安全性。如果你没有使用shared_ptr,你需要以其他方式确保对象不会被销毁。

返回的内容取决于是否要传递对象的所有权。如果对象已经位于其他位置的共享指针中,则不能从指向shared_ptr的指针转到。您必须从shared_ptr传递到shared_ptr,否则每个单独的shared_ptrs链将尝试删除该对象。多次删除=&gt;崩溃。

如果所有权与SceneManager一致,则返回引用将使对象易于使用并明确表达所有权内涵。

  

同样,要做一个我经常使用的有序地图:矢量   _scenesArray; map _scenesMap;

为了简单和灵活,我从他们开始拿着shared_ptrs开始。如果稍后在应用程序中出现瓶颈的情况不太可能,您可以将逻辑作为性能优化进行切换和添加。