본문 바로가기

C++

C++ 배우기 14(동적 할당)

동적 할당(new ~ delete)

우리가 앞서 배웠던 메모리 구조에서 힙 영역에 해당하는 부분이다. 힙 영역의 특징과 같이 크기에 상관이 없다.

C 스타일 언어에서 동적 할당에는 malloc, realloc, calloc, free와 같은 것들이 있지만, 우리가 배우는 C++ 스타일에서의

동적 할당은 new와 delete만 알면 된다.


동적할당 방법

우선 int자료형의 *p 변수는 main함수 안에 선언한 지역변수이므로 스택 영역에 저장이 된다.

그런데 우리가 동적 할당을 해주면 해당하는 값을 힙 영역에 담을 수 있게 된다.

*p에 new int(3)로 동적할당을 해주면, int형 정수 3이 힙 영역에 동적 할당되고, *p에는 그 주소가 담기게 된다.

 

그래서 첫 번째 cout 출력 시, *p에 담긴 주소 값이 가리키는 값인 3이라는 결과가 출력이 된다.

다음에 *p에 10의 값을 초기화시켰다. 이렇게 되면 *p에 담긴 주소 값을 타고 3의 값이 있던 곳으로 가서 10이라는 값으로

다시 초기화가 이루어지기 때문에, 다음 cout에서는 10이 출력되는 것을 볼 수 있다.

여기서 처음 동적 할당 시에 정한 자료형(int)에 맞는 값을 초기화시켜주어야 한다는 것을 알 수 있을 것이다.

 

하지만 앞서 메모리 관리에서 배웠던 것처럼 동적 할당을 사용하면 반드시 해제를 해주어야 메모리 누수의 문제를

방지할 수 있다고 배웠다.

따라서 new int(3)으로 동적할당을 했다면 delete p를 통해 반드시 할당 해제를 해주어야 한다.

 


배열의 동적할당

배열도 동적 할당이 가능하다. 위 사진처럼 동적 할당을 통해 배열의 크기를 결정해주는 방식으로 할 수 있다.

그래서 위의 방식처럼 for문을 통해 배열 초기화 후에 출력을 하면 0 1 2 3 순서대로 값이 출력되는 것을 볼 수 있다.

배열도 마찬가지로 동적 할당한 배열을 해제를 할 때 delete를 사용해주면 되는데, [ ]를 붙여서 해제하는 것만 기억하자.

 

 

동적할당을 이용한 배열크기 지정

여기서 중요한 것은 원래라면 배열의 크기는 미리 지정해주어 컴파일 타임 때 작동하도록 해주었지만,

동적 할당을 이용한다면 위 사진처럼, 런타임 때 배열의 크기를 지정해줄 수 있다는 점이다.