2014-11-13 2 views
2

다음 코드에서 "기본"범위를 종료 할 때 "상자 5i"가 올바르게 해제됩니까? 그들의 pointer guide에있는 문구는 변수가 범위를 벗어날 때 자동 "free()"호출이있는 것처럼 상자 유형의 변수가 작동 함을 나타냅니다. 그러나이 코드에서 "a"에 "free()"를 지정하면 힙에있는 "상자 8i"가 해제됩니다. "a"가 원래 가리키는 "상자 5i"는 어떻게됩니까?참조가없는 경우 Rust의 상자 유형이 자동으로 해제됩니까?

fn foo(a: &mut Box<int>) { 
    *a = box 8i; 
} 

fn main() { 
    let mut a = box 5i; 
    println!("{}", a); // -> "5" 
    foo(&mut a); 
    println!("{}", a); // -> "8" 
} 

답변

3

기본적으로 메모리 위치를 덮어 쓰면 이전 값의 소멸자가 실행됩니다. (C에서) &mut Box<T>, *a = box value가 동등 입력있다 a 그래서 만약 Box<...> 내용이, 콘텐츠의 소멸을 실행 (AN int 대해 아무것도하지 않는) 및 할당 해제 포함한다 :

어떤 의미에서
T_destroy(**a); 
free(*a); 
*a = malloc(sizeof T); 
**a = value; 

, 귀하의 질문에 대한 답변은 yes입니다. *a = box ...Box에 대한 유일한 참조 인 경우 *a = box ...이 작동한다는 것을 보장하기 때문에 그렇습니다. 그러나 대부분의 가비지 수집/관리 언어와 달리 동적으로 결정되는 것이 아니라 정적으로 결정됩니다 소유권 및 선형/아핀 유형의 결과).

+0

감사합니다. 프로그램이 실행되는 동안 가비지 수집이 아니라는 것을 알았습니다. 원래 상자가 자동으로 해제되었는지는 알 수 없었습니다. 나는이 평생 모델 – jefftime

+0

@MatthieuM에 대한 이해를 얻기 위해 여전히 노력하고 있습니다. 아, 미안, 오타. 나는 질문에 따라'a : & mut Box '을 가지고 있었다. (결정된.) – huon

관련 문제