new, delete
C++에서도 다른 언어와 마찬가지로 동적 메모리 할당은 heap에서 수행된다. C++에서 동적할당을 위한 키워드로 new, delete가 있다. primitive 타입도 new 키워드를 사용하여 동적할당이 가능하다. 동적할당한 메모리를 반환하기 위해서는 delete 키워드를 사용한다.
int main()
{
int *ptr = new int;
*ptr = 7;
int *ptr_2 = new int(8);
int *ptr_3 = new int{ 9 };
delete ptr;
delete ptr_2;
delete ptr_3;
return 0;
}
할당 해제 후 포인터를 역참조하면 오류가 발생한다.

메모리 누수
C에서 malloc한 메모리를 free하지 않으면 누수가 발생하듯 C++에서도 동적할당을 해제하지 않으면 메모리 누수가 발생한다. 실제로 작성할 일은 없는 코드이지만 직접 메모리 누수를 확인하기 위해 다음과 같은 코드를 실행한다.
while (true)
{
int *ptr = new int;
}
new 키워드를 사용만 하고 delete하지않기 때문에 메모리 사용이 지속적으로 증가하는것을 확인할 수 있다. 메모리 사용량이 갑자기 감소하는 것은 프로그램을 중간에 종료했기 때문이다.

delete를 수행하면 메모리 누수가 발생하지 않는다.

배열의 동적할당
배열을 정적으로 할당하기 위해서는 배열의 크기를 상수로 컴파일 타임에 미리 알 수 있어야 한다. new 키워드를 사용하면 런타임에 결정된 크기로도 배열을 선언할 수 있다. 이 경우에도 반드시 delete를 수행하여 메모리 할당을 해제해야 한다. 연이은 메모리를 해제하기 위해서는 []를 사용하여 명시한다.
int main()
{
int length;
cin >> length;
int *array = new int[length];
array[0] = 1;
array[1] = 2;
array[length - 1] = 123;
cout << array[0] << endl;
cout << array[1] << endl;
cout << array[length - 1] << endl;
delete [] array;
return 0;
}

만약 배열의 값을 0으로 초기화하고 싶다면 new int[length]() 와 같은 형태로 초기화하면 된다.
int length;
cin >> length;
int *array = new int[length]();
cout << array[0] << endl;
cout << array[1] << endl;
cout << array[length - 1] << endl;
delete [] array;

특정 값으로 초기화하고 싶다면 uniform initialization을 사용한다.
int length;
cin >> length;
int *array = new int[length] {123, 456, 789};
cout << array[0] << endl;
cout << array[1] << endl;
cout << array[length - 1] << endl;
delete [] array;

'C++ 학습' 카테고리의 다른 글
| [C++] for each (0) | 2023.11.23 |
|---|---|
| [C++] 참조 변수 (0) | 2023.11.22 |
| [C++] 포인터 연산 (0) | 2023.11.21 |
| [C++] 포인터 (0) | 2023.11.21 |
| [C++] 배열 (0) | 2023.11.19 |