반응형
원시 포인터에서 shared_ptr 만들기
개체에 대한 포인터가 있습니다. 소유권이있는 두 개의 용기에 보관하고 싶습니다. 그래서 나는 그것을 C ++ 0x의 shared_ptr로 만드는 것이 좋을 것이라고 생각합니다. 원시 포인터를 shared_pointer로 어떻게 변환 할 수 있습니까?
typedef unordered_map<string, shared_ptr<classA>>MAP1;
MAP1 map1;
classA* obj = new classA();
map1[ID] = how could I store obj in map1??
감사
동일한 원시 포인터로 shared_ptr 객체를 모두 초기화하지 않도록해야합니다. 그렇지 않으면 두 번 삭제됩니다. 더 나은 (그러나 여전히 나쁜) 방법 :
classA* raw_ptr = new classA;
shared_ptr<classA> my_ptr(raw_ptr);
// or shared_ptr<classA> my_ptr = raw_ptr;
// ...
shared_ptr<classA> other_ptr(my_ptr);
// or shared_ptr<classA> other_ptr = my_ptr;
// WRONG: shared_ptr<classA> other_ptr(raw_ptr);
// ALSO WRONG: shared_ptr<classA> other_ptr = raw_ptr;
경고 : 위의 코드는 나쁜 습관을 보여줍니다! raw_ptr
단순히 변수로 존재해서는 안됩니다. 의 결과로 스마트 포인터를 직접 초기화 new
하면 실수로 다른 스마트 포인터를 잘못 초기화 할 위험이 줄어 듭니다. 해야 할 일은 다음과 같습니다.
shared_ptr<classA> my_ptr(new classA);
shared_ptr<classA> other_ptr(my_ptr);
좋은 점은 코드가 더 간결하다는 것입니다.
편집하다
지도와 함께 작동하는 방법에 대해 자세히 설명해야합니다. 원시 포인터와 두 개의 맵이 있다면 위에서 보여준 것과 비슷한 작업을 수행 할 수 있습니다.
unordered_map<string, shared_ptr<classA> > my_map;
unordered_map<string, shared_ptr<classA> > that_guys_map;
shared_ptr<classA> my_ptr(new classA);
my_map.insert(make_pair("oi", my_ptr));
that_guys_map.insert(make_pair("oi", my_ptr));
// or my_map["oi"].reset(my_ptr);
// or my_map["oi"] = my_ptr;
// so many choices!
다양한 방법을 사용할 수 있지만 reset ()이 좋습니다.
map1[ID].reset(obj);
두 개의 맵이 동일한 shared_ptr을 참조하는 문제를 해결하기 위해 다음을 사용할 수 있습니다.
map2[ID] = map1[ID];
일반적으로 이중 삭제를 피하는 트릭은 원시 포인터를 전혀 피하는 것입니다. 따라서 다음을 피하십시오.
classA* obj = new classA();
map1[ID].reset(obj);
대신 새 힙 개체를 shared_ptr에 직접 넣습니다.
참조 URL : https://stackoverflow.com/questions/4665266/creating-shared-ptr-from-raw-pointer
반응형
'development' 카테고리의 다른 글
여러 javascript / css 파일 : 모범 사례? (0) | 2021.01.08 |
---|---|
봄 보안 AuthenticationManager 대 AuthenticationProvider? (0) | 2021.01.08 |
UISearchBar CGContext 오류 (0) | 2021.01.08 |
Visual Studio 2013 프로젝트의 새로운 Startup.cs 파일은 무엇입니까? (0) | 2021.01.08 |
Jenkins 파이프 라인에서 실패한 단계에 대한 재시도 옵션을 구현하려면 어떻게해야합니까? (0) | 2021.01.08 |