본문 바로가기
SWE/Qt

[Qt][C++] 자주 하는 실수 : 참조자를 리턴하는 함수 (&)

by S나라라2 2020. 10. 28.
반응형

알면서도 종종하는 실수인데, 제대로 정리해보자.

 

참조자를 리턴하는 함수에서 주의사항

 

예시를 보면 쉽게 이해가 간다. 아래와 같이 함수를 작성했다.

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];
    }

전역변수는 함수 외부에서 생성한 변수이기 때문에, 해당 함수가 호출되고 종료되어도 사라지지 않는다. 

따라서 해당 주소는 함수 종료 후에도 유효하다.

 

 

반응형