작성
·
232
1
강의 내용에서 26분경 ~ 27분까지의 내용에서
Knight k3에
이동 대입 연산자를 통해 넘길때, 예시를 기존에 만들어진 l-value인 k2를 오른값 참조로 강제 형변환해서 넘기고 있는데,
사실 이 부분은 굉장히 위험한 코드가 아닌가 생각되어 질문 남깁니다. 오른값 참조의 정의 설명에 있다시피 넘기는 대상은 사용하고 버릴것을 의도하는데,
사실 원본은 l-value였던 k2가 매우 긴 실행 흐름을 가져서 오랫동안 해제되지 않는다면, 지역을 벗어나지 못한다면, 더 나아가 이러한 k2 같은 존재가 1개가 아니라 다수였다면,
쓸데없이 메모리를 차지하는 변수들이 매우 많이 남을것 같아서 메모리누수 문제가 발생하지 않을까 생각되어 질문을 남깁니다.
단순 이해를 돕기위한 예시로 k2를 드신건지, 실제로는 제 생각과 다르게 저런식의 l-value 형태의 객체들을 강제형변환으로 넘겨서 많이 사용하는지 궁금하네요.
저는 말씀드린것처럼 일단 오른값 참조의 경우는 넘어오는 대상은 한번쓰고 버릴 임시객체로 이해하고 그런식의 의도로 코딩을 할 것이고, 또 남의 코드도 그런식으로 이해하려고 하는데 이런 생각이 잘못된걸까요?
k2는 설명에서 나온것처럼 지역을 벗어나면 적절하게 해제되고 문제가 없겠지만, 저것이 지역을 벗어나기 전까지는 여전히 메모리에 남아서 쓸데없이 공간을 차지한다는것이 신경쓰였습니다.
심지어 이것이 매우 큰 배열 형태였으면 어떡하지, 라는 생각도 했구요.
내부 내용을 이동했다할지라도, k2에는 여전히 메모리에 차지하고 있는 변수들이 살아있기에 포인터 변수가 아니라 일반 멤버변수들을 프로그래머가 실수로 접근하여 사용하는 잘못도 발생할 수 있다고 생각했습니다.
즉, 사용하고 버릴거면 당장 그 명령어 라인에서 벗어나면 사라져버리는 임시객체처럼 해야하는데, k2와 같은 l-value를 억지로 오른값 참조로 넘기는게 너무 위험한 행위가 아닌가 생각되네요. 제 생각이 혹시 잘못된 부분이 있을까요?
답변 1
2
정말 문법적으로 임시객체'만' 되는게 아니라는걸 설명하기 위해 예시를 들어본 것일 뿐이고,
특수한 상황 (unique_ptr이라거나...)이나 필요에 의해 알고 하는게 아니라면
당연히 저렇게 멋대로 오른값 캐스팅을 하면 안 됩니다!