동적 메모리 할당
정적으로 메모리를 할당하면 간편하고, 메모리 누수와 같은 부분을 신경쓰지 않아도 된다는 장점이 있지만, 할당된 메모리 크기가 말 그대로 정적이라 조절이 불가능해서 메모리가 추가로 필요할 때 대응이 어렵다. 따라서 동적으로 메모리를 할당하여 프로그램이 동작하는 중에 할당 메모리의 크기를 조절하는 방식이 필요하다.
C 에서는 malloc, calloc, realloc 을 이용하여 동적 메모리 할당을 하였고, C++ 에서도 cstdlib 를 include 하여 사용할 수 있지만, 다른 방법으로도 동적 메모리 할당이 가능하다.
참고로 정적 할당된 메모리는 스택 메모리를 사용하고, 동적 할당된 메모리는 힙 메모리를 사용한다. 또 추가로 C99 에서 표준으로 도입되었던 VLA(variable length array)는 대부분 컴파일러에서 스택 메모리를 사용한다.
new 를 사용한 동적 할당
- 변수 동적 할당
new 연산자를 이용한 기본적인 동적 할당 문법은 다음과 같다.
datatype* pointer_variable = new datatype;
포인터 변수 선언 후 new 를 이용해 메모리를 동적 할당한다.
- 배열 동적 할당
배열을 만들고 동적 할당하는 문법은 다음과 같다.
datatype* pointer_variable = new datatype [size];
포인터 변수 선언 후 new 를 이용해 메모리를 동적 할당하고, 이때 배열의 크기를 지정해주면 된다.
- 동적 할당 메모리 초기화
동적 할당 시 데이터 초깃값을 설정하는 문법은 아래와 같다.
datatype* pointer_variable = new datatype(initial_value);
단 배열은 동적 할당 시 초기화가 불가능하다.
delete 를 사용한 반환
- 변수 반환
delete 연산자를 이용하여 동적 할당된 변수를 반환하는 문법은 다음과 같다.
delete pointer_variable;
만약 동적으로 할당받지 않은 메모리를 반환하거나, 동일한 메모리를 여러번 반환할 경우 오류가 발생한다.
- 배열 반환
만약 동적 할당된 배열을 반환해야 한다면 반환하는 문법은 다음과 같다.
delete[] pointer_variable;
배열을 반환하는데 대괄호를 생략하면 비정상적 반환이 이루어진다.
단 다차원 배열을 동적 할당 하였다면, 가장 낮은 차원인 1차원 배열부터 차례로 반환해야 한다.
'Language > C & C++' 카테고리의 다른 글
[C++] 얕은 복사(shallow copy)와 깊은 복사(deep copy) 그리고 복사 생성자 (0) | 2024.10.13 |
---|---|
[C++] 값에 의한 호출(call by value)과 주소에 의한 호출(call by address) 그리고 참조에 의한 호출(call by reference) (0) | 2024.10.13 |
[C++] 클래스(class)와 객체(object) 선언 (0) | 2024.09.18 |
[C] 입출력 형식과 서식 지정자 (0) | 2024.08.30 |
[C] 연산자 우선순위 (0) | 2024.08.30 |