레퍼런스를 return하지 말라고 하는 이유는 뭔가요

왜 레퍼런스를 return하면 안 되는 건가요?

개인적으로 레퍼런스를 return 하는 코드를 많이 봤는데, 그럼 그 코드들은 다 잘못된 코드인가요?

1답변

  • 좋아요

    0

    싫어요
    채택취소하기

    이런걸 말씀하시는 건가요?

    int& getInt(void)
    {
        int i;
        return i;
    }
    

    레퍼런스를 return받은 경우, 별도로 레퍼런스를 처리해 주지 않으면 스택에 레퍼런스가 계속 남아있기 때문에 레퍼런스를 return하지 않는게 좋습니다. 다음의 코드도 같이 보면,

    int& getInt(void)
    {
        int *i = new int;
        return *i;
    }
    

    두 코드에 대해 int& myInt = getInt(); // &를 명시해줌 int badInt = getInt(); // &가 없음 delete &myInt; // delete할 수 있음 delete &badInt; // badInt가 스택에 할당된 int를 복사하지만 이걸 delete할 방법이 없음

    이기 때문이지요.

    제가 생각하기에 포인터나 레퍼런스를 return하는 가장 좋은 방법은

    int *getInt(void)
    {
        return new int;
    }
    

    와 같이 쓰는 것입니다. 이제 그럼 return을 받은 쪽에서는

    int *myInt = getInt(); // 포인터형으로 return받음 int& weirdInt = *getInt(); // 이 것도 쓸 수 있음 delete myInt; // 포인터니까 당연히 delete가능 delete &weirdInt; // 이것도 가능

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.