Rust에는 가비지 컬렉터가 없으며 바인딩이 범위를 벗어날 때 메모리가 어떻게 해제되는지 궁금합니다.
그래서이 예제에서 저는 Rust가 범위를 벗어날 때 'a'에 할당 된 메모리를 회수한다는 것을 이해합니다.
{
let a = 4
}
내가 가진 문제는 첫째로 이것이 어떻게 발생하는지, 둘째로 이것은 일종의 가비지 수집이 아닙니까? '일반적인'가비지 수집과 어떻게 다릅니 까?
Rust에는 가비지 컬렉터가 없으며 바인딩이 범위를 벗어날 때 메모리가 어떻게 해제되는지 궁금합니다.
그래서이 예제에서 저는 Rust가 범위를 벗어날 때 'a'에 할당 된 메모리를 회수한다는 것을 이해합니다.
{
let a = 4
}
내가 가진 문제는 첫째로 이것이 어떻게 발생하는지, 둘째로 이것은 일종의 가비지 수집이 아닙니까? '일반적인'가비지 수집과 어떻게 다릅니 까?
답변:
new()
C와 같은 기름 부음 된 함수를 가지고 있지 않습니다 . 그것들은 단지 정적 인 함수이며, 특히 let x = MyStruct::new()
스택에 객체를 생성하는 것과 같은 것 입니다. 힙 할당 의 실제 지표는 Box::new()
(또는 Box에 의존하는 구조)입니다.
전략이 무엇이든 프로그램에서 리소스 (메모리 포함)를 관리하는 기본 아이디어는 도달 할 수없는 "개체"에 연결된 리소스를 회수 할 수 있다는 것입니다. 메모리 외에도 이러한 리소스는 뮤텍스 잠금, 파일 핸들, 소켓, 데이터베이스 연결 등이 될 수 있습니다.
가비지 수집기가있는 언어는 주기적으로 메모리를 스캔하여 사용하지 않는 개체를 찾고, 연결된 리소스를 해제하고, 마지막으로 해당 개체에서 사용하는 메모리를 해제합니다.
Rust에는 GC가 없습니다. 어떻게 관리합니까?
Rust는 소유권이 있습니다. affine 유형 시스템을 사용하여 어떤 변수가 여전히 객체를 잡고 있는지 추적하고 이러한 변수가 범위를 벗어나면 소멸자를 호출합니다. 효과가있는 아핀 유형 시스템을 매우 쉽게 볼 수 있습니다.
fn main() {
let s: String = "Hello, World!".into();
let t = s;
println!("{}", s);
}
수율 :
<anon>:4:24: 4:25 error: use of moved value: `s` [E0382]
<anon>:4 println!("{}", s);
<anon>:3:13: 3:14 note: `s` moved here because it has type `collections::string::String`, which is moved by default
<anon>:3 let t = s;
^
이는 어느 시점에서든 언어 수준에서 소유권이 추적된다는 것을 완벽하게 보여줍니다.
이 소유권은 재귀 적으로 작동합니다. 만약 당신이 Vec<String>
(즉, 문자열의 동적 배열) 을 가지고 있다면 , 각각 String
은 Vec
변수 나 다른 객체 등이 소유하고있는에 의해 소유됩니다. 따라서 변수가 범위를 벗어날 때, 간접적으로도 보유한 모든 리소스를 반복적으로 해제합니다. 이 경우 Vec<String>
다음을 의미합니다.
String
Vec
자신 과 관련된 메모리 버퍼 해제따라서 소유권 추적 덕분에 모든 프로그램 개체의 수명은 하나 (또는 여러) 함수 변수에 엄격하게 연결되어 궁극적으로 범위를 벗어납니다 (그들이 속한 블록이 끝날 때).
참고 : 이것은 다소 낙관적입니다. 참조 카운트 ( Rc
또는 Arc
)를 사용하면 참조 주기를 형성하여 메모리 누수를 일으킬 수 있으며,이 경우주기에 연결된 리소스가 해제되지 않을 수 있습니다.
메모리를 수동으로 관리해야하는 언어에서는 스택과 힙 간의 차이가 중요해집니다. 함수를 호출 할 때마다 해당 함수 범위 내에 포함 된 모든 변수에 대해 스택에 충분한 공간이 할당됩니다. 함수가 반환되면 해당 함수와 관련된 스택 프레임이 스택에서 "팝 (pop)"되고 메모리는 향후 사용을 위해 해제됩니다.
실제적인 관점에서이 부주의 한 메모리 정리는 함수 범위의 끝에서 삭제되는 자동 메모리 저장 수단으로 사용됩니다.
여기에 더 많은 정보가 있습니다 : https://doc.rust-lang.org/book/the-stack-and-the-heap.html