반응형
알면서도 종종하는 실수인데, 제대로 정리해보자.
참조자를 리턴하는 함수에서 주의사항
예시를 보면 쉽게 이해가 간다. 아래와 같이 함수를 작성했다.
const QColor &getColor(int index)
{
if(index<0 || index>=StatusMax)
{
return QColor();
}
return m_color[index];
}
위의 함수를 간단히 설명하자면, 인덱스에 따라 색상을 반환하는 함수이다.
이 때, 인덱스 예외처리를 해주는데, 잘못된 인덱스에 접근하면 QColor()를 반환한다.
아무런 오류가 없어보이지만, 큰 실수는 함수의 return 값이다.
함수의 리턴값이 const QColor& 로 정의되어 있다.
const QColor&
이렇게 함수를 작성하고 빌드를 하면 아래와 같은 warning 메시지가 뜬다.
(className).h: In member function ‘const QColor& getColor(int)’:
(className).h:58:67: warning: returning reference to temporary [-Wreturn-local-addr]
"경고: 일시적인 참조자를 리턴하고 있다. [로컬 주소]"
경고 메시지의 원인은 함수의 반환값을 참조자(&)로 선언해놓은 것이다.
참조자(&)는 변수의 주소를 반환하는 것이다.
여기서는 함수 내에서 QColor를 생성하고 그것을 반환해주니까, 함수 getColor가 종료되면서 함수 내에서 선언해줬던 QColor는 소멸된다. 따라서 외부에서 QColor의 주소를 받아서 사용할 때, 이미 그 주소는 비어있어서 잘못된 어드레스에 접근할 수도 있고 큰 문제를 야기할 수 있다.
이럴 때의 해결책은 2가지가 가능하다.
1. 함수의 반환값을 참조자를 쓰지 않는다.
const QColor getColor(int index)
{
if(index<0 || index>=StatusMax)
{
return QColor();
}
return m_color[index];
}
const QColor& -> const QColor로 변경하였다.
2. 전역변수(함수 외부에서 생성된 값)을 반환한다.
QColor emptyColor = new QColor();
const QColor &getColor(int index)
{
if(index<0 || index>=StatusMax)
{
return emptyColor;
}
return m_color[index];
}
전역변수는 함수 외부에서 생성한 변수이기 때문에, 해당 함수가 호출되고 종료되어도 사라지지 않는다.
따라서 해당 주소는 함수 종료 후에도 유효하다.
반응형