我已经开始使用 std::tr1::shared_ptr ,到目前为止我非常喜欢它。我了解其中的一些缺陷(例如,两个相互包含智能指针成员的类)。但还有其他情况我不确定是否使用智能指针。
例如
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();
}
这里的“场景”显然会增加每个 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&)?
类似地,做一个我经常使用的有序图:vector _scenesArray; 地图_scenesMap;
所以我可以按名称或按顺序访问对象。使用 std::tr1::shared_ptr 它们应该都是 ScenePtr 吗?或者只是其中一个 ScenePtr 和另一个 Scene*?