development

원시 포인터에서 shared_ptr 만들기

big-blog 2021. 1. 8. 22:46
반응형

원시 포인터에서 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

반응형