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
728x90
그리드형(광고전용)
'Programming > C++' 카테고리의 다른 글
[C++] 벡터 내부의 중복된 문자 제거 방법 (0) | 2022.11.01 |
---|---|
[C++] 입력 함수 : cin(), getline() (and cin.ignore()) (0) | 2022.07.09 |
[C++] 범위 기반 for 문(Range-based for Statement) (0) | 2022.07.09 |
[C++] 자료형(Data Type) (0) | 2022.07.07 |
[C++] 이스케이프 시퀀스(Escape Sequence) (0) | 2022.07.07 |
[C++] 공백을 기준으로 문자열 나누기 (substr() 사용) (0) | 2021.10.31 |
[C++] std::unordered_map 에서 [] 연산자 (0) | 2021.05.28 |
main(int argc, char* argv[]) (0) | 2021.01.29 |