2016-08-27 2 views
0

나는 중학교 동료의 코드를 검토 중이며 다음 코드를 발견했습니다.C++ 스레드에 대한 참조로 로컬 변수 전달

void ActionGetId(boost::property_tree::ptree& callInfo); 
void ActionPutId(boost::property_tree::ptree& callInfo); 

void handler(int type, std::string data) 
{ 
    boost::property_tree::ptree callInfo(data); 
    if(type == 0) 
    { 
     _ioService.post(boost::bind(&ActionGetId, callInfo); 
    } 
    else 
    { 
     _ioService.post(boost::bind(&ActionPutId, callInfo); 
    } 
} 

그들은 지역 변수를 참조로 전달한 다음 함수를 종료합니다. 이러한 함수가 최종적으로 호출되면 지역 변수가 존재하지 않을 수 있습니다. 그러나이 프로그램은 충돌하지 않습니다. 어떻게 작동합니까?

+2

_ "그래도이 프로그램은 충돌하지 않습니다. 어떻게 작동합니까?"_ 충돌하지 않는다고해서 제대로 작동하는 것은 아닙니다. 정의되지 않은 동작은 정의되지 않습니다. –

+0

'callinfo'가 boost bind 안에 복사됩니다. – Arunmu

+0

코드를 단순화하여 스레드에 전달되는 내용과 방법을 명확하게 할 수 있습니까? '_ioService.post'가 무엇을하는지 아무도 모른다. – juanchopanza

답변

8

boost::bind은 제공 한 인수를 복사하고 반환하는 함수 개체에 복사본을 저장합니다. 함수가 호출되면 지역 변수 (더 이상 존재하지 않는)에 대한 참조가 아니라 사본에 대한 참조 (여전히 유효 함)에 따라 작동합니다.

당신이 실제로 (당신이 여기 싶지 않은) 변수에 대한 참조를 사용하는 boost::bind 또는 std::bind을 원한다면

, 당신은 boost::ref(var) 또는 std::ref(var)bind에 변수를 전달해야 할 것입니다.

+0

아, 좋아. 나는 항상 shared_ptr이나 값으로 함수를 바인드한다. 참조가 다르게 처리된다는 것을 깨닫지 못했습니다. 알아 둘만한. 감사. – Sharath