인프런 커뮤니티 질문&답변

초보언리얼님의 프로필 이미지
초보언리얼

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

오른값 참조 (rvalue reference)

lvalue형태를 강제형변환해서 오른값 참조로 넘기는것

작성

·

232

1

강의 내용에서 26분경 ~ 27분까지의 내용에서

Knight k3에

이동 대입 연산자를 통해 넘길때, 예시를 기존에 만들어진 l-value인 k2를 오른값 참조로 강제 형변환해서 넘기고 있는데,

사실 이 부분은 굉장히 위험한 코드가 아닌가 생각되어 질문 남깁니다. 오른값 참조의 정의 설명에 있다시피 넘기는 대상은 사용하고 버릴것을 의도하는데,

사실 원본은 l-value였던 k2가 매우 긴 실행 흐름을 가져서 오랫동안 해제되지 않는다면, 지역을 벗어나지 못한다면, 더 나아가 이러한 k2 같은 존재가 1개가 아니라 다수였다면,

쓸데없이 메모리를 차지하는 변수들이 매우 많이 남을것 같아서 메모리누수 문제가 발생하지 않을까 생각되어 질문을 남깁니다.

단순 이해를 돕기위한 예시로 k2를 드신건지, 실제로는 제 생각과 다르게 저런식의 l-value 형태의 객체들을 강제형변환으로 넘겨서 많이 사용하는지 궁금하네요.

저는 말씀드린것처럼 일단 오른값 참조의 경우는 넘어오는 대상은 한번쓰고 버릴 임시객체로 이해하고 그런식의 의도로 코딩을 할 것이고, 또 남의 코드도 그런식으로 이해하려고 하는데 이런 생각이 잘못된걸까요?

k2는 설명에서 나온것처럼 지역을 벗어나면 적절하게 해제되고 문제가 없겠지만, 저것이 지역을 벗어나기 전까지는 여전히 메모리에 남아서 쓸데없이 공간을 차지한다는것이 신경쓰였습니다.

심지어 이것이 매우 큰 배열 형태였으면 어떡하지, 라는 생각도 했구요.

내부 내용을 이동했다할지라도, k2에는 여전히 메모리에 차지하고 있는 변수들이 살아있기에 포인터 변수가 아니라 일반 멤버변수들을 프로그래머가 실수로 접근하여 사용하는 잘못도 발생할 수 있다고 생각했습니다.

즉, 사용하고 버릴거면 당장 그 명령어 라인에서 벗어나면 사라져버리는 임시객체처럼 해야하는데, k2와 같은 l-value를 억지로 오른값 참조로 넘기는게 너무 위험한 행위가 아닌가 생각되네요. 제 생각이 혹시 잘못된 부분이 있을까요?

답변 1

2

Rookiss님의 프로필 이미지
Rookiss
지식공유자

정말 문법적으로 임시객체'만' 되는게 아니라는걸 설명하기 위해 예시를 들어본 것일 뿐이고,
특수한 상황 (unique_ptr이라거나...)이나 필요에 의해 알고 하는게 아니라면
당연히 저렇게 멋대로 오른값 캐스팅을 하면 안 됩니다!

초보언리얼님의 프로필 이미지
초보언리얼

작성한 질문수

질문하기