ManuallyDrop
ManuallyDrop (소멸자 호출 억제 래퍼)
컴파일러가 T의 소멸자를 자동으로 호출하는 것을 억제하는 래퍼예요. 이 래퍼는 0-비용이에요.
출처: Rust 공식 문서
본문
ManuallyDrop은 T와 같은 레이아웃과 비트 유효성을 가지며, T와 같은 레이아웃 최적화가 적용된다고 보장돼요. 결과적으로, 컴파일러가 그 내용에 대해 하는 가정에 영향을 주지 않아요. 예를 들어 mem::zeroed로 ManuallyDrop을 초기화하는 것은 정의되지 않은 동작이에요. 초기화되지 않은 데이터를 다뤄야 한다면 MaybeUninit을 사용하세요.
ManuallyDrop 안의 값에 접근하는 것은 안전하다는 점에 유의하세요. 즉 내용이 이미 드롭된 ManuallyDrop을 공개 안전 API로 노출하면 안 돼요. 이에 대응해, ManuallyDrop::drop은 unsafe예요.
ManuallyDrop과 드롭 순서
Rust는 값의 잘 정의된 드롭 순서를 가져요. 필드나 지역 변수가 특정 순서로 드롭되도록 하려면, 선언을 재정렬해서 필드가 드롭되기 전에 해당 필드가 사용되지 않도록 해야 해요.
pub struct ManuallyDrop<T>
where
T: ?Sized,
{ /* private fields */ }