我已经开始使用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 *?
答案 0 :(得分:0)
这一切都取决于用例。
因为您怀疑使用指针或引用将节省引用计数开销。
...但是......通常开销不足以担心并且:
如果在多个线程中使用sceneManager
或者此函数需要重新安全,则可能首选通过共享指针访问的安全性。如果你没有使用shared_ptr,你需要以其他方式确保对象不会被销毁。
返回的内容取决于是否要传递对象的所有权。如果对象已经位于其他位置的共享指针中,则不能从指向shared_ptr的指针转到。您必须从shared_ptr传递到shared_ptr,否则每个单独的shared_ptrs链将尝试删除该对象。多次删除=&gt;崩溃。
如果所有权与SceneManager
一致,则返回引用将使对象易于使用并明确表达所有权内涵。
同样,要做一个我经常使用的有序地图:矢量 _scenesArray; map _scenesMap;
为了简单和灵活,我从他们开始拿着shared_ptrs开始。如果稍后在应用程序中出现瓶颈的情况不太可能,您可以将逻辑作为性能优化进行切换和添加。