-한마디 설명-
C++의 RAII와 Move semantics가 기본 동작임
-긴 설명-
Rust의 메모리 관리 방법이 스마트 포인터라는 알못이 있기에 설명하려 함. 스마트 포인터였으면 Rust로 코드작성하는 걸 '컴파일러와 하는 싸움"이라고 자조하지도 않았지.
사실 Rust를 좋아하는 이유는 이 메모리 관리 메커니즘을 C++에서 사용하면 분명하게 안전한 프로그램을 만들 수 있기 때문임. 하지만 C++은 그게 힘들지.
Rust에는 객체(메모리라고 해도 좋음)에 대한 소유권 개념이 존재함. 하지만 기본 타입(정수형 실수형 진위형)에는 이게 희미함. 따라서 기본 제공하는 객체타입인 String을 예로 들겠음.
이라고 하면 String객체 하나가 생성되고 val이 그 소유권을 쥐고 있음. Rust의 모든 객체는 소유권을 진 변수가 살아있는 범위{ }를 벗어나면 해제됨.
함수 func는 String객체를 받음. 이때
func를 호출하면 val이 가진 String객체를 넘겨주고 이 소유권은 func함수에 있는 매개인자 v에개로 넘어감. 따라서
v가 살아있는 범위를 벗어나는 순간, String객체는 해제됨.
함수 func를 호출한 다음 println!룰 통해서 val를 출력하려 하는데, val이 가진 객체는 존재하지 않아. 따라서 컴파일 에러가 뜸(런타임 에러가 아님)
이건 너무 빡빡하지. 따라서 레퍼런스도 있음. 레퍼런스는 객체를 빌린다고 생각하면 됨.
이 경우 함수func를 호출한다 해서 val이 가진 String객체를 주는 게 아니니까 에러가 뜨지 않음.
한편 이 레퍼런스 변수는 객체를 가진 변수보다 오래 살아있을 수 없음.
이 함수는 애초에 컴파일 에러가 나서 컴파일 할 수 없음. 왜냐면 어느 상황에서나 레퍼런스 변수가 객체보다 오래 살아 있기 때문이지.
----
작년 7~8월쯤에 디씨 프갤에 올렸던 거 블로그에다 올렸는데, 다시 여기에 올려봄.
개츄얌
이게 이제 이해가 되네 그니까 통상 프밍 언어에 해체가 밑에 자동으로 딸려있다고 보면 되는거군
메모리 누수를 막기위해 이지랄을 한건가
ㅇㅇ 비슷함
http://m.dcinside.com/board/programming/930730
그니까 스코프넘어가면 객체는 소멸한다는거임?
넘어가거나 move되면 소멸함
근데 c언어도 스코프내에선 선언된건 범위 넘어가면 소멸하는데 뭐가 다른거임?
동적 할당에 대해서
c는 동적할당하면 free 하기 전까지 메모리에 남아있음 없어지는거 아님