의 값으로 힙에 다른 주소로 포인터 포인트를 삭제하고 지금은하지 않는 프로그램은 명시 적 유형 약어 함께 :
가 작은 정리해
let mut boxed_int: Box<int> = box 5;
let mut _ref_to_int: &mut int = &mut *boxed_int; // (1)
*_ref_to_int = 10;
let mut boxed_int: Box<int> = box 5;
let mut _ref_to_int: &mut Box<int> = &mut boxed_int; // (2)
*_ref_to_int = box 10;
: Box
스마트 포인터 힙 할당을 캡슐화합니다. 포함 된 유형의 값을 저장하기에 충분한 공간을 할당하고이 메모리를 추적하여 범위를 벗어날 때 할당을 해제합니다. 본질적으로 이는 가치와 비슷한 의미를 제공합니다. 코드의 첫 번째 조각
(1) boxed_int
콘텐츠에 빌려
: 먼저, 역 참조
*
Box<int>
int
을 얻는, 다음
&mut
즉시
&mut int
결과, 기준을 생성한다. 당연히
*_ref_to_int = 10
은 상자 내용을 덮어 씁니다. 따라서
boxed_int
뒤에 10 개가 포함됩니다. 여기서 할당 또는 할당 해제가 발생하지 않습니다.
(2)의 코드 두 번째 부분에서 boxed_int
을 빌리므로 _ref_to_int
은 &mut Box<int>
입니다. *_ref_to_int = box 10
은 박스형 값 자체를 대체합니다. 이전 boxed 값이 범위에서 즉시 벗어나기 때문에 소멸자가 호출되고 해당 힙 메모리가 해제됩니다. 그런 다음 힙에 새로운 메모리 조각이 할당되고 방금 해방 된 메모리 대신 포인터가 쓰여집니다 (box 10
).
그래서,
마지막 라인은 힙에서 5를 삭제하고 같은 주소에 10을 할당 하는가?
예 아니오. 마지막 줄은 힙에서 5를 삭제하고 10을 할당하지만 동일한 주소에는 할당하지 않습니다. 실제 주소는 다를 수 있지만 Box
은 숫자 값을 노출하지 않으므로 알 수 없습니다.