shared_ptr에 대한 질문
글쓴이: telepathy070 / 작성시간: 금, 2016/01/01 - 9:53오후
제 소스를 봐주세요.
long long extern_raw_cstring_address; static std::unordered_map<void *, int> ref_map; //맵 void first_func() { CString *tmpCString = new CString("hello world"); std::shared_ptr<CString> cr = shared_ptr<CString>(tmpCString, DebugDelete()); //std::shared_ptr<CString> cr = make_shared<CString>(*tmpCString); CString *raw_cstring = cr.get(); TRACE(*raw_cstring); // ---> "hello world"로 잘 나옴 TRACE("\r\n"); extern_raw_cstring_address = (long long)(raw_cstring); //주소를 extern에 저장 CString *test_cstring = reinterpret_cast<CString *>(extern_raw_cstring_address); TRACE(*test_cstring); //그 주소로 다시 CString을 재구성해도 데이터 정상임 TRACE("\r\n"); //아래는 shared_ptr이 가르키는 값을 map에 집어넣음 auto it = ref_map.find(cr.get()); if (it != ref_map.end()) { if (int intObj = it->second) { //return TRUE; } else { ref_map.erase(it); } } ref_map.emplace(cr.get(), 777); //맵에 shared_ptr 주소 대입함 } void second_func() { CString *test_cstring = reinterpret_cast<CString *>(extern_raw_cstring_address); TRACE(*test_cstring); TRACE("\r\n"); }
질문입니다.
first_func()에서 CString을 shared_ptr에 넣고 주소를 extern에 저장해두었습니다.
reference count가 0이 될것 같아서
map에 다가 shared_ptr의 주소를 집어넣었습니다.
하지만 second_func()를 불러보면 그 shared_ptr는 first함수에서 이미 삭제되고
그 주소에 쓰레기 값만 들어가있습니다.
원래 shared_ptr가 가르키는 객체의 주소를 .get()해서 다른 포인터에(저처럼 map같은 데다가) 집어넣으면 reference count가 증가하는게 아니었나요?
그래서 함수를 나가더라도 삭제가 안되야 하는것 아닌가요?
Forums:
gilgil.net
> 원래 shared_ptr가 가르키는 객체의 주소를 .get()해서 다른 포인터에(저처럼 map같은 데다가) 집어넣으면 reference count가 증가하는게 아니었나요?
아니오.
www.gilgil.net
shared_ptr 자체가 포인터이면서 레퍼런스를
shared_ptr 자체가 포인터이면서 레퍼런스를 카운트하는 객체입니다.
shared_ptr::get()으로 반환된 포인터는 shared_ptr 객체가 사라지면 dangling pointer가 되어 사용할 수 없습니다.
포인터 자체를 인자로 받는 legacy code를 사용하는 목적 외에는 shared_ptr::get()은 사용하지 않으시는 것이 좋습니다.
댓글 달기