러스트에서 힙 메모리를 할당하는 가장 간단한 방법
Box<T>는 단순히 T타입값을 힙에 할당하고 그 포인터를 자체적으로 보관
메모리의 관점에서는 타입 시스템으로 사용에 제약을 둔 포인터
따로 해제할 필요없이 데이터가 더이상 사용되지않는 시점에 해제되도록 컴파일 타임에 컴파일러가 보장
레퍼런스 카운터 포인터
여러 변수가 동일한 값을 참조할 수 있게 함
레퍼런스 카운트가 0이 되면 소멸
여러 참조가 공유하므로 기본적으로 불변데이터만 참조
불변으로 정의된 타입에 내부 가변성을 주는 특별한 타입
러스트는 다중읽기-단일쓰기 규칙을 컴파일타임에 보장
RefCell은 이러한 규칙을 런타임에 체크함으로서 성능과 유연성을 트레이드오프
여러 스레드에서 레퍼런스 카운터를 바꿀 수 있는 Atomic Rc
Rc는 스레드가 안전하지 않으므로 스레드간에 공유되는 값에 사용
레퍼런스카운터는 순환참조가 생겨 메모리 누수 발생 가능
순환 참조는 런타임에 일어나는 일이므로 컴파일러의 감지 불가
이러한 누수를 방지하기위해 순환참조가 필요한 곳에 소유권이 없는 관찰자 포인터인 Weak 포인터를 사용
Weak는 데이터를 소유하지는 않고 데이터가 살아있는지만 확인하고 싶을 때 쓰는 포인터
Weak가 참조하고 있어도 원본 소멸 가능
그래서 Weak는 데이터가 살아있는지 먼저 확인한 후 접근하는 방식으로 구현됨