[Rust] 소유권(ownership)

김민재·2022년 7월 21일

Rust Basic

목록 보기
1/3
post-thumbnail

동적 메모리 관리 중요성

프로그램 실행중 동적으로 할당된 메모리의 경우 2가지를 고려해야한다.

  • 동적할당한 메모리 해제 타이밍
  • 해제된 메모리 포인터 사용 방지

2가지를 고려하지 않을경우 메모리 누수로 심각한 문제(dangling pointers, double frees, using uninitialized memory)가 생길수 있다. 이를 해결하기 위한 방법으로 Garbage collection이 있다. 프로그램이 실행될때 GC를 추가로 동작시키기 때문에 성능-안전성 간의 트레이드오프가 존재한다.

관련 논문 : SoK: Eternal War in Memory

러스트의 동적 메모리 관리

Rust는 컴파일시간에 동적으로 할당된 메모리의 문제를 검사하기 때문에 성능, 안전성을 동시에 보장할 수 있다.이를 위해 러스트는 컴파일시간에 동적메모리 관리를 지원하기 위해 객체간의 소유권의 개념을 적용해 사용한다.

소유권의 개념(by C/C++)

클래스의 인스턴스가 그것이 가리키는 다른 객체를 소유하고 있다. 클레스가 소유한 객체를 언제 해제할지 결정하기 때문에, 클레스가 제거되면 소유권 또한 제거 한다. 그러나 그객체를 참조하는 다른 포인터를 제거하지 않으면 앞서 말한 문제가 발생한다.

Rust에서의 소유권

Rust에서 간단한 상수값을 빼고 모든 객체에 대한 소유권은 단 하나만 가지고 있다. 따라서 '='연산자에 대한 동작은 move동작을 실행한다. 그래서 아래 코드에서 에러가 발생한다.

let s = vec![1, 3, 4, 57];
let t = s; // t <- s; 
let u = s; // Error!!

따라서 에러를 발생 시키지 않게 하려면 아래처럼 복사를 사용해야 한다.

let s = vec![1, 3, 4, 57];
let t = s.copy(); // t <- s; 
let u = s.copy(); // Error!!

0개의 댓글