-
[c++] 람다 캡쳐를 잘못 사용했다.프로그래밍/의문 2014. 7. 10. 03:07반응형
Socket* socket = queue_.front();
impl_.async_accept(*socket, [&](const ErrorCode& error) // 전부 참조([&])로 했을 때 socket이 쓰레기 값으로 받아졌었다.
{
if (error)
{
throw error;
}
else
{
accepted_sockets_.push(socket); // 여기서 쓰레기 값이 대입이 됨
}
}
);
생각없이 저 코드를 썼다. 당시엔 이상한 점이 없다고 생각했지만 -_-;
async 함수가 비동기 함수이다.
bind가 된 완료함수가 언제 불릴지 모른다는 말.
따라서 스택에 있던 Socket* socket의 값은 완료함수가 호출된 시점에선 쓰레기 값이 되고, 나는 그걸 참조해서 사용하려 했던 것이다.
저런 상황에서 값을 참조하려면
Socket* socket = queue_.front();
impl_.async_accept(*socket, [socket](const ErrorCode& error)
[socket]처럼 복사로 캡쳐하여 사용을 해야한다.
반응형'프로그래밍 > 의문' 카테고리의 다른 글
컴파일러 경고 warning C4127 (0) 2015.03.20 코딩 스타일은 개발자의 지문 (0) 2015.02.12 32비트 OS(운영체제)에서 64비트 OS로 바꾸면 성능이 꼭 향상만 될까? (0) 2015.02.04 bad_descriptor 오류와 PeerManager (0) 2014.10.31 null문자가 없는 문자로 string을 초기화 시킨 문제 (0) 2014.05.06