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()은 사용하지 않으시는 것이 좋습니다.
댓글 달기