컴파일 시 보장되는 것들

컴파일 시 정적 메모리 관리:

  • 초기화되지 않는 변수가 없습니다.
  • 메모리 누출 없음(거의. 강의참조노트 참고.)
  • 메모리 이중 해제가 원천적으로 불가능 합니다.
  • 메모리 해제 후 사용이 원천적으로 불가능 합니다.
  • NULL포인터는 없습니다.
  • 뮤텍스를 잠궈 놓고 여는 것을 잊는 실수를 할 수 없습니다.
  • 스레드간 데이터 레이스를 막아줍니다.
  • 반복자가 갑자기 무효화 되는 경우가 없습니다.

(안전한) 러스트에서도 메모리 누출이 발생할 수 있는 몇 가지 경우가 있습니다:

  • Box::leak을 이용하여 포인터를 의도적으로 누출시킬 수 있습니다. 이를 이용해서 런타임이 생성하고 런타임이 크기를 정한 정적 변수를 가져올 수 있습니다
  • std::mem::forget을 사용하여 컴파일러가 값에 대해 “잊도록” 만들 수 있습니다(소멸자가 실행되지 않음을 의미합니다).
  • Rc 또는 Arc를 사용하여 실수로 순환참조를 생성할 수도 있습니다.
  • 컬렉션을 무한정 채우는 것을 메모리 누출로 간주할 수도 있지만, 러스트는 이를 보호하진 못합니다.

본 강의에서는 “메모리 누출 없음“을 “우발적인 메모리 누출 없음“으로 이해해야 합니다.