1 분 소요

Dynamic Memory Allocation이란?

  • compile time이 아닌 run time에 메모리 할당
  • 크기 유동적으로 변경
  • 사용 예시 : user input에 따른 메모리 할당, linked list
  • 장단점 : Array vs Linked List

      Array Linked List
    특징 [Static Memory allocation]
    - compile time에 메모리 할당
    - stack에 저장
    [Dynamic Memory allocation]
    - run time에 메모리 할당
    - heap에 저장
    장점 - 빠름
    - 자동 alloc/dealloc
    - fragment없이 연속된 저장
    - 유동적인 크기
    - 유동적으로 데이터 넣고 빼기 쉬움
    단점 정확한 크기 예측 힘듦 → 메모리 낭비 발생 - next/prev pointer를 저장할 추가 메모리 필요
    - 느림
    - 수동 alloc/dealloc
    - 연속된 변수 중 중간 것부터 dealloc하여 fragment 발생 가능

C에서의 사용법 : malloc function

  • C++에서도 가능
  • #include
  • allocation
    • parameter : memory size(bytes)
    • return : 할당한 공간을 가리키는 void pointer 혹은 NULL(메모리 부족. 할당 실패)
  • deallocation
    • free function
    • parameter : allocation 시 return 된 pointer

C++ 버전 : new/new[]

int* foo1;
int* foo5;

foo1 = new int;    //int 1개 공간 할당, 시작 부분 가리키는 pointer 반환
foo5 = new int [5];//int 5개 공간 할당, 시작 부분 가리키는 pointer 반환

delete foo1;
delete[] foo5;    //[]안에 숫자 넣을 필요 없다. foo5안에 크기 정보가 들어있기 때문.
  • foo5를 malloc으로 구현하면

      foo = (int*) malloc(sizeof(int) * 5 + 4);
    

    이때 추가 할당 된 4 byte가 사이즈에 대한 정보(5)를 저장한다.

new의 예외 처리(Exceptions) : 할당 실패 시

  • 기본 : bad_alloc
    • 프로그램 running 중 문제 발생 시 발생, 자동으로 프로그램 멈춰 줌.
  • 직접 지정 : nothrow
    • C style exception
    • 메모리 할당 실패 시, nullptr을 return한다.
      int * foo;
      foo = new (nothrow) int [5];
      if (foo == nullptr) {
      		
      }
    

Class 동적 할당

  • new/delete 사용
    • malloc의 경우 공간만 할당해주는 함수이므로, 이와 같이 생성자와 파괴자를 부르는 역할을 할 수 없고 type을 지정할 수 없다. 따라서 malloc으로는 class를 동적 할당하지 못하고, new/delete를 사용하여야 한다.
  • new로 class 할당 시, 해당 class의 constructor가 불러진다.
  • delete/delete[]로 dealloc 시, []개의 destructor 불러야 한다.
Triangle *t2;
t2 = new Triangle(2.0, 2.0, 3.0); //dynamic 선언

태그:

카테고리:

업데이트: