rust의 소유권
-
기본
- rust에서 모든 변수는 owner를 가짐
- owner는 하나의 스코프에서 하나만 생겨남
- pc가 스코프를 벗어나 기존의 owner가 버려질 때, 해당 owner를 가진 모든 변수는 drop함수를 실행하고, free됨
-
할당과 관련된 골치아픈 경우
let x = String::from("hello"); let y = x;
-
이경우 x와 y는 두개의 변수이며, 같은 owner를 지니기 때문에 동시에 drop됨
-
그러나 x와 y는 동일한 힙의 데이터를 바라보고 있기 때문에, 두번 drop되면 안됨
-
따라서 rust에서는 변수(x)가 복사되는 순간 기존의 변수(x)는 무효화 시킴
- 이를 이동(move)라고 표현함
- rust에서는 명시적으로 사용하지 않는한 모든 변수를 shallow copy함
-
만에하나 아래처럼 이동된 변수를 사용한다면 에러가 발생함
let x = String::from("hello"); let y = x; println!(x); error[E0382]: use of moved value: `s1` --> src/main.rs:4:27 | 3 | let y = x; | -- value moved here 4 | println!(x); | ^^ value used here after move | = note: move occurs because `x` has type `std::string::String`, which does not implement the `Copy` trait
-
단 i32처럼 스택에 들어갈 수 있는 것들은 move되지 않고 copy됨
- 이는 copy 트레잇으로 구분됨
- copy와 drop 트레잇이 동시에 구현되어 있다면 또한 오류
-
-
함수 호출과 관련된 골치 아픈 경우
let x = String::from("hello") sample(x); // x가 파라미터 s로 move됨 println!(x); // 소유권이 종료되었기 때문에 사용 불가 fn sample(s:: String) { println!(s); } // s의 소유권 종료. s의 drop 호출
- 맙소사 함수를 호출하면서 파라미터에 변수가 복사되었고, 이는 이후에 사용 불가함
- 이를 해결하기 위해서는 두가지로 보이는데
-
- &연산자를 사용해서 pointer를 넘겨줌
- 포인터는 값에 대한 소유권이 없다
-
- 함수가 다시 변수를 반환해서 동일한 값에 저장
- 변수가 반환되면, 이는 일종의 move로 drop되지 않는다
-