
328
이펙티브 러스트
할당과 해제가 항상 짝을 이루게 하려면,
C
에서 할당한 메모리가 유출(누수
leak
)되는 것을 자동
으로 막아주는
RAII
래퍼를 구현한다(아이템
11
). 이런 래퍼 구조체는
C
할당 메모리를 소유
한다.
/// C 라이브러리에서 할당한 메모리를 소유하는 래퍼 구조체
struct FfiWrapper {
// 불변성: inner는 NULL이 아님
inner: *mut FfiStruct,
}
또한
Drop
구현은 누수 가능성을 방지하도록 이 메모리를
C
라이브러리로 반환한다.
/// 직접 구현한 [`Drop`]:
/// C 라이브러리에서 할당한 메모리를 반드시 해제시킨다.
impl Drop for FfiWrapper {
fn drop(&mut self) {
// 안전성: `inner`는 NULL이 아닐 뿐만 아니라,
// `free_struct()`는 NULL 포인터에 대처한다.
unsafe { free_struct(self.inner) }
}
}
이 원리는 힙 메모리뿐만 아니라 다른 곳에도 똑같이 적용된다.
Drop
을 구현해
FFI
파생 리소스
(예: 열린 파일, 데이터베이스 연결 등)에
RAII
를 적용한다
(아이템
11
).
C
라이브러리와의 상호 작용을 래퍼 구조체로 캡슐화하면 다른 잠재적 문제도 막을 수 있다.
예를 들어 ...