Borrow 안전선
Vec 요소 참조가 살아 있으면 push 재할당 가능성이 안전선이 된다
벡터의 요소 참조는 현재 저장 공간을 바라본다. 그 상태에서 값을
추가하면 내부 버퍼가 옮겨질 수 있으므로, 러스트는 읽기 참조와 변경을
같은 생존 구간에 두지 않는다.
읽기 참조
let first = &v[0]가 요소 위치를 빌린다.
변경 요청v.push(6)은 길이 증가와 재할당 가능성을 만든다.
뒤에서 사용참조를 나중에 출력하면 생존 구간이 push 뒤까지 늘어난다.
| 상황 | 컴파일러가 보는 상태 | 위험 | 안전한 고치기 |
|---|---|---|---|
| 요소 빌림 |
first가 벡터 내부 요소를 읽기 참조로 잡고 있다.
|
벡터 저장 공간이 유지된다는 보장이 필요하다. | 참조 사용을 먼저 끝내고 뒤에서 변경한다. |
| 뒤에서 사용 | 참조가 선언 위치가 아니라 마지막 사용 지점까지 살아 있다. | 중간의 변경이 읽기 참조와 겹친다. | 출력을 push 앞에 두거나 별도 블록으로 범위를 닫는다. |
| push 변경 | 벡터 길이 변경은 가변 빌림이 필요한 작업이다. | 용량 부족이면 요소가 새 주소로 이동할 수 있다. |
값이 복사 가능하면 let first = v[0]로 소유 값을 둔다.
|
| 재할당 가능성 | 실제 재할당 여부와 상관없이 가능성만으로 막는다. | 낡은 참조가 이전 버퍼를 가리키는 상황을 예방한다. | 인덱스를 저장하고 변경 뒤 다시 읽는다. |
참조 먼저 사용
println!을 push보다 앞에 둔다.
생존 구간 닫기블록을 나눠 읽기 참조가 끝난 뒤 변경한다.
값 복사작은 Copy 값은 참조 대신 값을 저장한다.
다시 조회인덱스를 들고 있다가 변경 후 새로 접근한다.