프로그래밍 언어론 3-2강. 객체 수명과 메모리 관리

[프로그래밍 언어론]

2019. 10. 26. 14:26

 

[key events]

: 바인딩할때 고려사항들

  • Objects(객체)의 생성과 제거 = 객체의 life time
  • Binding(바인딩)의 생성과 제거 = 바인딩의 life time
  • 잠깐 사용되지 않는 바인딩 비활성화와 재활성화
  • 변수, 함수, 타입등과 같이 바인딩 사용하는 것들에 대한 참조 (생성과 제거, 비활성화 재활성화의 차이 인지하기)

     (A a = new A(5) : name-to-object)

 

 

 

[바인딩 생명주기와 객체 생명 주기]

  • 바인딩의 수명(Binding’s lifetime) : name과 object 간의 바인딩 생성부터 제거까지의 기간
  • 객체의 수명(Object’s lifetime) : 객체의 생성부터 제거까지의 기간 

    # 이 두 생명주기는 무조건 동시 진행 되지 않는다.

    # 일반적으로 객체 생명주기 ⊃ 바인딩 생명주기

ex)

void func(Test* v) {       # v의 바인딩 수명
  int c = v->getValue(); 
  printf("c");
  delete v;   # 객체 v 제거(허상 포인터 문제)

int main() {
  Test* t = new Test(5); # 객체 생성시점
  func(t);
  printf("t->getValue()"); # 바인딩은 있지만 객체가 사라진 상태 '0' 출력

 

 

 

[Garbage와 dangling reference]

  • Garbage(가비지) : 객체가 바인딩보다 오래지속 될 때 발생
name이 객체를 point(binding)하고 있는 상황에서 해당 name에 다른 point(주소값)를 지정해주면, 
해당 point가 가르키고 있던 객체(값)이 없어져, 사용되지 않는 객체(값)이 되는데 이를 가비지라고 한다.
  • Dangling reference(허상 포인터) : 객체보다 바인딩이 오래 지속 될 때 발생

     (name에서 객체를 향한 바인딩은 남아있는데 객체 값이 없어져 버린 상태)

 

 

 

[객체 생명주기의 분류]

: 일반적으로, Object’s lifetime은 객체 공간 관리를 위한 3가지 메모리 할당 방법중 하나와 일치한다.

  • 정적 객체(Static object) : 프로그램 실행되는 동안 유지되는 가상 주소값이 주어짐
  • 스택 객체(Stack object) : LIFO, 재귀를 위한 함수 공간
  • 힙 객체(Heap object) : 임의 시점에서 할당(사용자 재량), 연결 데이터 구조와 같은 동적 할당, 좋고비싼 메모리 관리 알고리즘 필요.

 


- Objects life time
- Binding life time
- Binding 비활성, 활성
- 바인딩 사용하는 것들에 대한 참조
: 가비지, 허수 포인터, 다른 함수내 진입시 기존 바인딩 상태(여기선 안다룸)등 관련

- 바인딩의 생명 주기 : 바인딩 생성 ~ 제거
- 객체의 생명 주기 : 객체 생성 ~ 제거
<특징>
- 둘의 생명주기 무조건 동시발생 X
- 일반적으로 객체 생명주기 ⊃ 바인딩 생명 주기 (반대인 경우도 존재 가능)

- 가비지 : 객체가 바인딩보다 오래지속될때, 더이상 사용되지 않는 객체
- 허상 포인터 : 바인딩은 있는데 바인딩이 가르키고 있는 객체값이 없어져버린 상태

- 객체 생명주기 분류 : 정적 객체 / 스택 객체 / 힙 객체 (다음 글에서 다룸)