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
'Programming > C++' 카테고리의 다른 글
[C++] unordered_map (0) | 2022.11.08 |
---|---|
[C++] map(맵) (0) | 2022.11.08 |
[C++] pair(페어)와 tuple(튜플) (0) | 2022.11.03 |
[C++] lower_bound(), upper_bound() ; 이진 탐색(Binary Search) (0) | 2022.11.01 |
[C++] sort 함수를 이용하여 오름차순/내림차순 정렬하는 방법 (0) | 2022.10.27 |
[C/C++] 현재 날짜/시간 원하는 형태로 출력하기 (0) | 2022.10.20 |
[C++] bits/stdc++.h (1) | 2022.10.18 |
[C++] cin.ignore() (0) | 2022.07.09 |