13.1 RAII

Rust에서 변수는 스택에 데이터를 보관하는 것 이상이다: 이들은 또한 자신의 자원이다, 예를 들어 Box<T>가 힙에 자신의 메모리를 갖듯이. Rust가 집행하는 RAII. (자원 획득이 초기화다)로 언제 개체가 범위를 벗어나더라도 그 자신의 소멸자를 호출하여 자신의 리소스를 해제한다.

이런 행위는 자원 유출(resource Leak) 버그를 막아주기 때문에 수동으로 메모리를 해제하거나 메모리 유출에 대해 다시는 고민할 필요가 없다! 여기 간단한 예제다:

// raii.rs
fn create_box() {
    // 힙에 정수를 할당
    let _box1 = Box::new(3i32);

    // `_box1`은 여기서 소멸되고, 메모리는 해제된다.
}

fn main() {
    // 힙에 정수를 할당
    let _box2 = Box::new(5i32);

    // 중첩 범위:
    {
        // 힙에 정수를 할당
        let _box3 = Box::new(4i32);

        // `_box3`은 여기서 소멸되고, 메모리는 해제된다.
    }

    // 재미삼아 많은 Box 하기
    // 수동으로 메모리를 해제할 필요 없다!
    for _ in 0u32..1_000 {
        create_box();
    }

    // `_box2`은 여기서 소멸되고, 메모리는 해제된다.
}

당연하게도, valgrind를 사용해 메모리 에러를 이중으로 검사할 수 있다: Of course, we can double check for memory errors using valgrind:

$ rustc raii.rs && valgrind ./raii
==26873== Memcheck, a memory error detector
==26873== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==26873== Using Valgrind-3.9.0 and LibVEX; rerun with -h for copyright info
==26873== Command: ./raii
==26873==
==26873==
==26873== HEAP SUMMARY:
==26873==     in use at exit: 0 bytes in 0 blocks
==26873==   total heap usage: 1,013 allocs, 1,013 frees, 8,696 bytes allocated
==26873==
==26873== All heap blocks were freed -- no leaks are possible
==26873==
==26873== For counts of detected and suppressed errors, rerun with: -v
==26873== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

릭은 없었다!

See also:

Box

results matching ""

    No results matching ""