Socket 통신에서 Send()
동작을 구현하던 중.. 이상하게 Send()
함수의 데이터가 사라지는 버그가 발견됐다.
한참 디버깅을 하다가 아래 코드에서 pop()
이후에 참조하는 데이터가 사라져 있음을 파악했다.
string SendQueue::Front()
{
string& ret = _bufferQueue.front();
cout << "ret: " << ret << endl;
_bufferQueue.pop();
cout << "ret: " << ret << endl;
return ret;
}
queue의 front()
함수 자체는 참조를 반환한다. 그래서 참조로 받을 수 있다. 그런데 pop()
을 해버리면 참조하던 객체를 소멸시켜버리게 된다. 이렇게 되면 참조자이지만 참조하는 객체가 없는 상태가 발생할 수 있다. 따라서 아래와 같이 사용하자.
queue
의front()
함수를 통해 값을 받을 땐 이후에 반드시pop()
호출이 있을 것이기 때문에 참조가 아닌 값으로 전달 받자!
// 정상 동작하는 코드
string SendQueue::Front()
{
string ret = _bufferQueue.front(); // ret의 타입을 참조가 아닌 값 타입으로 선언하면 된다.
_bufferQueue.pop();
return ret;
}
함수가 값을 반환할 때에 참조로 받으려 한다면 아래와 같은 컴파일 에러가 발생한다.
아래처럼 **‘const 참조’**로 바꾸면 값을 할당할 수 있다.
const int& rr = ff();