728x90
728x90

C++에서의 동적 할당 방법

동적 할당(Dynamic Allocation)

  • 실행 시간 동안 사용할 메모리 공간을 할당하는 것
  • 동적 메모리 할당을 이용하면 배열의 크기를 가변적으로 생성할 수 있다.
  • 메모리 영역 중 힙(Heap) 영역에 저장된다.
    • 사용자가 원할 때 메모리에 등록시키고, 원할 때 해제시킬 수 있다.
    • 동적 할당한 메모리를 해제하지 않을 경우 메모리 누수가 발생한다.
    • 프로그램을 종료해도 메모리에 계속해서 상주한다.
  • 동적 할당은 C 방식 C++ 방식으로 나뉜다.

 

C 기반 동적 할당
  • C 기반 동적 할당 방법으로는 malloc(), calloc() 함수를 이용한 방법이 있다.
  • 동적 할당을 해제할 때는 free() 함수를 사용한다.

 

C++ 기반 동적 할당
  • C++ 에서는 new 연산자를 사용하여 동적 할당을 수행할 수 있다.
  • 힙(Heap) 영역에 자료형의 크기만큼 공간을 할당하고, 자료형의 포인터형으로 주소를 형 변환하여 반환한다.
  • 동적 할당을 해제할 때는 delete 연산자를 사용한다.

 

① malloc() 함수를 이용한 동적 할당

int *pArr;
pArr = (int*)malloc(sizeof(int) * 4);    
// int 형 사이즈 * 4 만큼의 메모리를 동적 할당한다. 
// 결국, pArr[4] 를 선언하는 것과 같다.
  • malloc() 함수로 생성한 동적 메모리는 쓰레기 값으로 초기화가 된다.
  • 동적 할당된 메모리를 해제할 때는 free() 함수를 사용한다.
free(pArr);    // 동적 할당된 메모리 해제

 

② calloc() 함수를 이용한 동적 할당

int pArr;
pArr = (int*)calloc(4, sizeof(int));
// int 형 사이즈 * 4 만큼의 메모리를 동적 할당한다. 
// 결국, pArr[4] 를 선언하는 것과 같다.
  • calloc() 함수로 생성한 동적 메모리는 0으로 초기화가 된다.
  • 동적 할당된 메모리를 해제할 때는 free() 함수를 사용한다.
free(pArr);    // 동적 할당된 메모리 해제

 

③ new 연산자를 이용한 동적 할당

int* pArr = new int(4);    // 동적 할당과 동시에 초기화
int* pArr = new int[4];
// int 형 사이즈 * 4 만큼의 메모리를 동적 할당한다. 
// 결국, pArr[4] 를 선언하는 것과 같다.
  • 자료형의 반환값이 주소값이므로 포인터형으로 받아야 한다. 
  • 동적 할당된 메모리를 해제할 때는 delete 연산자를 사용한다.
delete pArr;    // 동적 할당된 메모리 해제

 

malloc() vs. new 연산자

  • malloc() 은 해당 포인터의 타입을 모르기 때문에 반환값의 자료형은 (void *)이다.
    • 따라서 malloc() 함수를 사용할 때 int* i = (int*) malloc(sizeof(int) * 3)와 같이 자료형을 앞에 선언해 줘야 한다.
  • 하지만 new 연산자는 Type-Safe 로 해당 객체에 맞는 포인터로 반환해 준다.
    • 따라서 별도의 자료형 선언을 할 필요가 없다.
    • Type-Safe란,  컴파일러가 타입형을 확인해주는 것이다.
      •  int 형은 int 형으로 String 형은 String 형으로 잘 저장되고 있는지 컴파일러가 확인하는 것이다.
  • new 연산자를 이용해 객체를 생성하면 초기 값을 줄 수 있다.
    • 예) Test a = new Test(123);
    • new 연산자로 객체를 생성하면 생성자(Constructor)가 호출된다.
  • 하지만, malloc() 은 생성자 호출 기능이 없어 초기값을 줄 수 없다.
  • new 연산자를 통해 객체 생성시 에러가 발생하면 예외 처리(Exception Handling)를 하지만, malloc() 은 예외 처리 없이 NULL 값을 반환한다.
  • malloc()  realloc() 으로 할당된 메모리 크기를 재조정이 가능하지만, new 연산자는 할당된 크기에 대한 메모리 크기 재조정이 불가능하다.
  • new 연산자는 malloc() 함수를 이용하여 구현되었기 때문에 malloc() 함수를 사용하는 방법이 new 연산자를 이용한 방법 보다 빠르다는 의견이 있다.
  • delete 연산자와 free() 모두 메모리를 해제한다는 점은 같지만, delete 연산자는 소멸자(Destructor)를 호출해주지만, free()는 소멸자를 호출해주는 기능을 갖고 있지 않다.

 

동적 할당 사용 예

1차원 배열의 동적 할당과 해제

  • C++에서 1차원 배열의 동적 할당과 해제는 다음과 같이 한다.
// 동적 할당
int* ary = new int[ROW];

// 동적 할당 해제
delete[] ary;

 

2차원 배열의 동적 할당과 해제

  • C++에서 2차원 배열의 동적 할당과 해제는 다음과 같이 한다.
// 동적 할당
int** ary = new int*[ROW];
for (int i = 0; i < ROW; i++) {
    ary[i] = new int[COL];
}

// 동적 할당 해제
for (int i = 0; i < ROW; i++) {
    delete[] ary[i];
}
delete[] ary;

 

728x90
728x90