본문 바로가기
C,C++/Error & Warning

스레드 함수의 인자로 shared_ptr을 전달할 때 주의할 점 | _Incref 에러

by woohyeon 2020. 11. 8.
반응형

주의할 점이라기 보단 나처럼 바보같은 실수로 시간 낭비하는 일이 없었으면 해서..

기존에 잘 사용하던 함수가 있었는데, 이 함수를 메인 스레드가 아니라 new 스레드를 만들어서 new 스레드가 수행하도록 했다. 근데 뭔가 오류가 발생했다. 디버거로 한 단계씩 보았는데도 문제점을 찾기 어려웠다. 

좀 더 자세히 확인해 보니 함수 내에서 인자를 사용하는 부분에서 런타임 에러가 발생했다.  바로 이 부분

호출부

혹시나 인자가 잘못 전달됐는지, 잘못 캐스팅됐는지 메모리를 확인해 보아도 당연히 똑같았다. 스레드를 사용하기 전이랑.

원래 디버깅 중에 런타임 에러가 발생하면 라이브러리 함수 내에서 에러가 발생한 부분을 보여준다. 근데 보통 봐도 도움이 안됐던 적이 많아서 이번에도 그냥 넘겼었다. 하지만 달리 방법이 없어 보고 생각해 보기로 했다. 에러의 내용은 다음과 같았다.


음.. 자세히 보니 기존의 shared_ptr를 참조하는 변수가 하나 늘어나면서 참조 카운트를 증가시키는 부분에서 에러가 발생한 듯 했다. 딱 여기까지만 납득이 갔다. 음 여기서 에러가 발생했군. 어느 동작에서 에러가 발생했 다는 건 OK. 근데 왜 때문에? 곰곰이 생각해 보자... 스레드를 사용하지 않을 땐 에러가 발생하지 않았다. 그런데 스레드를 사용하니까 갑자기 참조가 안된다.. 호출한 영역과 계속 번갈아 가면서 확인.. 하다가 갑자기 아차 싶었다. 참조 카운트를 증가시키기 전에 shared_ptr이 사라진 것이다 ㅋㅋ..

여기에 전달된 shared_ptr는 이 함수를 호출한 곳(스레드를 생성한 곳)에서 지역 변수였다. 마침 wait이 필요했던 동작도 아니였고 메인 스레드는 이 스레드를 생성해주고 나머지 작업을 하고 스코프를 벗어났다. 그 때 shared_ptr의 참조 카운트가 0이 되어서 사라진다. 그리고 해당 스레드에선 사라진 shared_ptr의 참조 카운트를 증가시키다 보니 저기서 에러가 난 것이다. 완전 부주의한 실수.

static 타입으로 변경해보니 잘된다. 후련.




댓글