24. 2.6 메모리 관리
메모리에는 유일한 소유권이 있습니다
소유권은 메모리를 해제할 권리입니다
소유권은 이름에 속합니다
소유권은 이전할 수 있습니다
25. 2.6 메모리 관리
fn main() {
let s = String::from(“DEVIEW”);
println!(“{}”, s);
}
s의 수명
26. 2.6 메모리 관리
fn main() {
let s = String::from(“DEVIEW”);
let t = s;
println!(“{}”, t);
}
s의 수명
t의 수명 (s에서 이전)
27. 2.6 메모리 관리
참조를 써서 메모리를 빌려 갈 수 있습니다
&T: 읽기 참조 (접근 가능)
&mut T: 쓰기 참조 (접근, 변경 가능)
T: 소유권 (접근, 변경, 해제 가능)
28. 2.6 메모리 관리
fn main() {
let s = String::from(“DEVIEW”);
let t = &s;
println!(“{}”, s, *t);
}
s의 수명
t의 수명 (s의 참조)
29. 2.6 메모리 관리
메모리를 빌려간 참조가 있는 동안은 해제할 수 없습니다
소유권자의 수명이 다하기 전에 갚아야 합니다
30. 2.6 메모리 관리
fn print(it: String) {
println!(“{}”, it);
}
fn main() {
let s = String::from(“DEVIEW”);
let t = &s;
print(s);
}
s의 수명
t의 수명 (s의 참조)
it의 수명
31. 2.6 메모리 관리
error: cannot move out of ‘s’ because it is borrowed
8 print(s);
note: borrow of ‘s’ occurs here
7 let t = &s;
32. 2.6 메모리 관리
fn print(it: &String) {
println!(“{}”, *it);
}
fn main() {
let s = String::from(“DEVIEW”);
print(&s);
println!(“{}”, s);
}
s의 수명
it의 수명 (s의 참조)
35. 2.7 무효화
fn main() {
let mut m = HashMap::new();
m.insert(“kr”, “Korea”);
let k = “kr”;
let o = m.get(&k);
m.clear();
if let Some(v) = o {
println!(“{} = {}”, k, *v);
}
}
o의 수명 = m의 내부 참조 수명
m의 변경
36. 2.7 무효화
error: cannot borrow ‘m’ as mutable because it is also borrowed
as immutable
8 m.clear();
note: previous borrow of ‘m’ occurs here; the immutable borrow
prevents subsequent moves or mutable borrows of ‘m’ until the
borrow ends
7 let o = m.get(&k);
37. 2.7 무효화
fn get<’a, ’b>(&’a self, k: &’b K) -> Option<&’a V>
get의 반환값은 k가 아니라 self를 참조한다고 선언합니다
다시 쓰이지 않는 선언은 생략할 수 있습니다
fn get<’a>(&’a self, k: &K) -> Option<&’a V>
38. 2.7 무효화
fn main() {
let mut m = HashMap::new();
m.insert(“kr”, “Korea”);
let k = “kr”;
m.get(&k);
m.clear();
}
임시 = m의 내부 참조 수명
m의 변경
40. 3.1 메모리 안전성과 쓰레드 안전성
다른 참조가 있는데 메모리를 해제하면 버그
다른 참조가 있는데 메모리를 변경하면 버그 (무효화)
(다른 쓰레드에) 다른 참조가 있는데
(동기화 없이) 메모리를 변경하면 버그 (data race)
41. 3.2 잘못 사용할 수 없는 인터페이스
impl<T> Mutex<T> {
fn lock(&self) -> &mut T { ... }
}
여러 쓰레드에서 변경 가능한 데이터
하지만 변경 가능한 참조를 얻으려면 반드시 동기화를 거쳐야 함
내부를 구현할때는 컴파일러 검사를 잠시 중단 (unsafe)
외부에서 사용할때는 컴파일러가 검사
42. 3.2 잘못 사용할 수 없는 인터페이스
impl<T> RwLock<T> {
fn read(&self) -> &T { ... }
fn write(&self) -> &mut T { ... }
}