NeuroWhAI의 잡블로그

[Rust] std::rc의 Rc, Weak 스마트 포인터 예제 본문

개발 및 공부/언어

[Rust] std::rc의 Rc, Weak 스마트 포인터 예제

NeuroWhAI 2018. 10. 27. 15:10


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)로 해줘야 하는지...

뭐 아마 이유가 있겠죠?



Comments