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은 자원 정리를 타입에 묶고, 소유권 시스템은 같은 값의 정리 코드가 두 번 실행되거나 이미 버린 값을 다시 쓰는 상황을 막는다.