2014-10-08 5 views
2

글쎄, 나는 최근에 녹에서 프로그램을 시작했고 도움이 필요하다. 내 코드는 다음과 같습니다. int에 할당 된 힙을 참조하고 값을 변경해야합니다.int의 상자에 대한 참조와 int에 대한 참조가 녹스는 데 차이가 있습니까?

let mut boxed_int = box 5; 
let _ref_to_int = &mut *boxed_int; // why it is &int ??? 
*_ref_to_int  = 10; 

let mut boxed_int = box 5; 
let _ref_to_int = &mut boxed_int; 
*_ref_to_int  = box 10; 

마지막 줄은 힙에서 5를 삭제하고 동일한 주소에 10을 할당합니까? 또는 5 여기에 10

답변

4

의 값으로 힙에 다른 주소로 포인터 포인트를 삭제하고 지금은하지 않는 프로그램은 명시 적 유형 약어 함께 :

가 작은 정리해
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은 숫자 값을 노출하지 않으므로 알 수 없습니다.

관련 문제