Rust
강하 특성 - 녹에서 파괴자
수색…
비고
드롭 특성을 사용한다고해도 매번 실행된다는 의미는 아닙니다. 범위를 벗어나거나 풀 때 실행되지만, 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