Socket 통신에서 Send() 동작을 구현하던 중.. 이상하게 Send() 함수의 데이터가 사라지는 버그가 발견됐다.

한참 디버깅을 하다가 아래 코드에서 pop() 이후에 참조하는 데이터가 사라져 있음을 파악했다.

string SendQueue::Front()
{
	string& ret = _bufferQueue.front();
	cout << "ret: " << ret << endl;
	_bufferQueue.pop();
	cout << "ret: " << ret << endl;

	return ret;
}

image.png

queue의 front() 함수 자체는 참조를 반환한다. 그래서 참조로 받을 수 있다. 그런데 pop() 을 해버리면 참조하던 객체를 소멸시켜버리게 된다. 이렇게 되면 참조자이지만 참조하는 객체가 없는 상태가 발생할 수 있다. 따라서 아래와 같이 사용하자.

queuefront() 함수를 통해 값을 받을 땐 이후에 반드시 pop() 호출이 있을 것이기 때문에 참조가 아닌 값으로 전달 받자!

// 정상 동작하는 코드
string SendQueue::Front()
{
	string ret = _bufferQueue.front(); // ret의 타입을 참조가 아닌 값 타입으로 선언하면 된다.
	_bufferQueue.pop();

	return ret;
}

참고

함수가 값을 반환할 때에 참조로 받으려 한다면 아래와 같은 컴파일 에러가 발생한다.

image.png

아래처럼 **‘const 참조’**로 바꾸면 값을 할당할 수 있다.

const int& rr = ff();