수색…


비고

드롭 특성을 사용한다고해도 매번 실행된다는 의미는 아닙니다. 범위를 벗어나거나 풀 때 실행되지만, mem::forget 가 호출 될 때 항상 그렇다고 볼 수는 없습니다.

푸는 동안 패닉이 발생하여 프로그램이 중단되기 때문입니다. 그것은 또한 Abort on Panic 스위치가 켜져있는 Abort on Panic 로 컴파일되었을 수도 있습니다.

자세한 내용은 책을 확인하십시오 : https://doc.rust-lang.org/book/drop.html

단순 삭제 구현

use std::ops::Drop;

struct Foo(usize);

impl Drop for Foo {
    fn drop(&mut self) {
        println!("I had a {}", self.0);
    }
}

정리를위한 드롭

use std::ops::Drop;

#[derive(Debug)]
struct Bar(i32);

impl Bar {
    fn get<'a>(&'a mut self) -> Foo<'a> {
        let temp = self.0; // Since we will also capture `self` we..
                           // ..will have to copy the value out first
        Foo(self, temp) // Let's take the i32
    }
}

struct Foo<'a>(&'a mut Bar, i32); // We specify that we want a mutable borrow..
                                  // ..so we can put it back later on

impl<'a> Drop for Foo<'a> {
    fn drop(&mut self) {
        if self.1 < 10 { // This is just an example, you could also just put..
                         // ..it back as is
            (self.0).0 = self.1;
        }
    }
}

fn main() {
    let mut b = Bar(0);
    println!("{:?}", b);
    {
        let mut a : Foo = b.get(); // `a` now holds a reference to `b`..
        a.1 = 2;                   // .. and will hold it until end of scope
    }                              // .. here
        
    println!("{:?}", b);
    {
        let mut a : Foo = b.get();
        a.1 = 20;
    }
    println!("{:?}", b);
}

Drop을 사용하면 간단하고 오류없는 디자인을 만들 수 있습니다.

런타임 메모리 관리 디버깅을위한 삭제 로깅

Rc로 런타임 메모리를 관리하는 것은 매우 유용 할 수 있습니다. 특히 코드가 매우 복잡하고 단일 인스턴스가 여러 범위의 수십 또는 수백 가지 다른 유형으로 참조되는 경우에는 머리를 감싸기가 어려울 수 있습니다.

println!("Dropping StructName: {:?}", self); Drop println!("Dropping StructName: {:?}", self); 을 포함하는 Drop 특성을 작성합니다 println!("Dropping StructName: {:?}", self); 구조체 인스턴스에 대한 강력한 참조가 언제 실행되는지 정확하게 볼 수 있으므로 디버깅에 매우 중요합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow