std :: tr1 :: shared_ptr을 사용하기 시작했으며 지금까지 아주 좋아합니다. 함정 중 일부 (예 : 스마트 포인터 멤버가 서로 포함 된 두 개의 클래스)를 이해합니다. 하지만 스마트 포인터를 사용할지 여부를 확신 할 수없는 다른 경우가 있습니다.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을 반환하는 것이 좋습니다, 또는 씬 매니저 :: 장면 (i)는 A (장면 *) 또는 (장면 &)을 반환해야합니까?
마찬가지로, 자주 사용하는 순서가 지정된지도를 만들려면 다음을 사용합니다. vector _scenesArray; 지도 _scenes지도;
개체에 이름이나 순서대로 액세스 할 수 있습니다. std :: tr1 :: shared_ptr를 사용하면 둘 다 ScenePtr이되어야합니까? 또는 그 중 하나 ScenePtr과 다른 하나 Scene *?
"tr1 :: shared_ptr"을 (를) 사용하고 있습니까? 아니면'std :: shared_ptr'가'tr1' 네임 스페이스에 정의되어있는 Visual Studio를 사용하고 있습니까? –
'SceneManager :: scene'은'SceneManager'를 리턴해야한다고 생각합니다. 왜냐하면'SceneManager'와'(get) scene'은 내가 처리 할 리소스가'Scene'이라는 것을 암시하기 때문입니다. – GManNickG
그리고 GMan의 생각에 뒤이어,'scene()'이 참조 *를 직접적으로 돌려주는 지에 대해서 편집증이있는 참조 카운트를 스켈치합니다. 매달려있는 참조를 사용하지 않도록하기 위해 그것까지 달려 있지만, 이것이 고수하기가 어려울 것 같지 않습니다. – WhozCraig