별의 공부 블로그 🧑🏻‍💻
728x90
728x170

C++ 에서의 동적 할당(Dynamic Allocation) 방법

동적 할당(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()는 소멸자를 호출해주는 기능을 갖고 있지 않다.

 

참고 사이트

https://hwan-shell.tistory.com/12

 

c++ new의 사용법, malloc과의 차이(free, delete)

※컴퓨터의 메모리 구조를 알고 보시면 더 쉽게 이해할 수 있습니다.  메모리 구조 보러가기(클릭) 프로그램을 만들다 보면 상황에 따라 추가적인 메모리 공간을 실시간으로 확보해야 할 경우

hwan-shell.tistory.com

 

728x90
그리드형(광고전용)
⚠️AdBlock이 감지되었습니다. 원할한 페이지 표시를 위해 AdBlock을 꺼주세요.⚠️
starrykss
starrykss
별의 공부 블로그 🧑🏻‍💻


📖 Contents 📖