Notice
Recent Posts
Recent Comments
NeuroWhAI의 잡블로그
[Rust] std::rc의 Rc, Weak 스마트 포인터 예제 본문
C++로 비유하면 Rc는 shared_ptr, Weak는 weak_ptr입니다.
다만 스레드 안전하지 않다는 점이 다릅니다.
스레드 안전한 구현은 std::sync에 Arc, Weak라는 이름으로 있습니다.
아래는 cppreference의 weak_ptr::lock 예제 코드를 Rust버전으로 옮겨 본 예제 코드입니다.
use std::rc::{Rc, Weak};
fn observe(w_ptr: &Weak<i32>) {
if let Some(rc_ptr) = w_ptr.upgrade() {
println!("\tobserve() able to upgrade Weak<>, value={}", *rc_ptr);
}
else {
println!("\tobserve() unable to upgrade Weak<>");
}
}
fn main() {
let mut w_ptr = Weak::new();
println!("Weak<> not yet initialized");
observe(&w_ptr);
{
let rc_ptr = Rc::new(42);
w_ptr = Rc::downgrade(&rc_ptr);
println!("Weak<> initialized with Rc.");
observe(&w_ptr);
}
println!("Rc<> has been destructed due to scope exit.");
observe(&w_ptr);
}
Weak<> not yet initialized observe() unable to upgrade Weak<> Weak<> initialized with Rc. observe() able to upgrade Weak<>, value=42 Rc<> has been destructed due to scope exit. observe() unable to upgrade Weak<>
참 쉽죠?
근데 w_ptr.upgrade()는 되면서 downgrade는 rc_ptr에서 바로 못하는게 이상하네요.
rc_ptr.downgrade()하면 편할텐데 왜 굳이 Rc::downgrade(&rc_ptr)로 해줘야 하는지...
뭐 아마 이유가 있겠죠?
'개발 및 공부 > 언어' 카테고리의 다른 글
[C++] STL nth_element 알고리즘 설명 및 예시 (3) | 2018.11.01 |
---|---|
[Rust] access to extern crates through prelude is experimental (0) | 2018.10.27 |
[C++] shared_mutex, shared_lock 사용 예시 (0) | 2018.10.19 |
[C++] Memory order (0) | 2018.10.16 |
[Kotlin] object (0) | 2018.10.07 |
Comments