[Rust] 스마트 포인터- Box<T>

iguigu·2022년 6월 14일
0

Box<T>를 사용하여 힙에 데이터 저장

fn main(){
	let b = Box::new(5);
    println!("b={}",b);
}
  • 5라는 값을 가리키는 Box의 값을 갖는 변수 b
  • 이 때, 5는 heap에 저장 됨
  • main scope를 벗어나면 변수 b의 메모리 할당은 해제 될 것임
  • 일반적으로 단일 값을 힙에 저장하는 것은 유용하지 않음

Box를 이용한 재귀적 타입

  • 컴파일 타임에서 러스트는 타입이 사용하는 메모리를 알아야 함
  • 컴파일 타임에 재귀적 타입은 크기를 알 수가 없음
  • cons list (construct function의 약자)
  enum List{
      Cons(i32, List),
      Nil,
  }
  • 잘못된 예시
  use List::{Cons, Nil};

  fn main(){
      let list = Cons(1, Cons(2, Cons(3, Nil)));
  }

  error[E0072]: recursive type `List` has infinite size
   --> src/main.rs:1:1
    |
  1 | enum List {
    | ^^^^^^^^^ recursive type has infinite size
  2 |     Cons(i32, List),
    |               ----- recursive without indirection
    |
    = help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to
    make `List` representable

  • Box 이용 (직접 값을 저장하는 것이 아니라 값의 포인터 저장)
  fn main(){
  	let list = Cons(1,
    			Box::new(Cons(2,
                	Box::new(Cons(3,
                    	Box::new(Nil))))));
  }

profile
2929

0개의 댓글