Drop 흐름
소유권의 끝은 하나이고, 정리도 한 번만 실행된다
스코프가 끝나면 러스트가 Drop::drop을 자동 실행한다. 더
빨리 정리하려면 std::mem::drop에 값을 넘겨 소유권을
끝내야 하며, drop 메서드 직접 호출은 금지된다.
핵심 규칙
자동 정리
직접 호출
조기 해제
한 값의 소유권 종료 지점이 정해지면 정리 코드는 그 지점에서 한 번만 실행된다.
ownership stack
블록 끝에 남은 값
reverse order
생성의 역순으로 정리
1
d.data 해제
마지막에 만든 값부터
Drop::drop 실행
2
c.data 해제
같은 스코프의 이전 값은 그 다음에 정리
compiler guard
직접 소멸은 차단
E0040
c.drop()처럼 소멸자를 직접 호출하지 못한다.
E0382
drop(c) 뒤에는 이동된 c를 다시 쓸 수
없다.
스코프 종료 경로
automatic
트리거
main 또는 블록 끝
호출
컴파일러가
Drop::drop 자동 삽입
순서
d 먼저, c 다음
std::mem::drop 경로
explicit
트리거
drop(c) 호출
소유권
c가 함수로 이동하며 그 자리에서 정리
이후
남은 스코프에서
c 재사용 불가
어떤 호출을 선택해야 하나
| 상황 | 사용 형태 | 정리 시점 | 안전 장치 |
|---|---|---|---|
| 자연 종료 대부분의 지역 변수 | 아무 것도 호출하지 않음 | 스코프가 끝날 때 | 역순 정리로 자원 의존성 보호 |
| 조기 해제 락, 파일, 버퍼를 먼저 놓고 싶을 때 |
std::mem::drop(value)
|
호출한 줄에서 즉시 | 값 이동 후 재사용 금지 |
| 직접 소멸자 호출 중복 해제 위험이 있는 형태 | value.drop() |
컴파일 단계에서 차단 | E0040으로 실행 자체를 막음 |
Safety result
Drop은 자원 정리를 타입에 묶고, 소유권 시스템은 같은 값의
정리 코드가 두 번 실행되거나 이미 버린 값을 다시 쓰는 상황을 막는다.