OneDev
[C++] new 와 delete : 메모리 할당과 해제 본문
▣ 서론
메모리 관리는 언제나 중요한 문제이다.
프로그램이 정확히 실행되기 위해서는 컴파일 시 모든 변수의 주소값이 확정되어야만 했는데,
이를 위해서 프로그램에 많은 제약이 따랐다.
이에 프로그램 실행시 자유롭게 할당하고 해제할 수 있는 힙(Heap) 이라는 공간이 따로 생겼다.
컴파일러에 의해 안정성이 보장되는 스택(Stack) 과 달리 힙은 사용자가 스스로 제어해야 하기 때문에
책임이 다른다.
C 언어에서는 힙 상에서의 메모리 할당과 해제를 위해 malloc 함수와 free 함수를 지원하였다면,
C++ 언에 차원에서 지원하는 것이 new 와 delete 이다.
(물론 C++에서도 malloc 과 free 를 사용할 수 있다)
new 는 malloc에 대응되는 것으로 메모리를 할당하고,
delete 는 free에 대응되며 할당된 메모리를 해제할 때 사용된다.
▣ new 와 delete 의 기본적인 사용법
new 와 delete의 기본적인 형식은 다음과 같다
(예)
#include <iostream>
int main() {
int* p = new int; // int 크기의 공간을 할당하여 그 주소값을 p 에 대입
*p = 10; // p위치의 할당된 공간에 10이란 값을 집어넣었다
std::cout << *p << std::endl;
delete p; // 메모리를 할당했다면 반드시 해제할 것!
return 0;
}
delete p 를 하게 되면 p 에 할당된 공간이 해제된다.
이 때 delete 로 해제할 수 있는 공간은 어디까지나 new 를 통해 할당된 공간뿐이다.
일반 지역변수 등을 delete 로 해제하려 하면 Heap 이 아닌 공간을 해제하려 한다는 경고메세지를 볼 수 있을것이다.
▣ new 로 배열 할당하기
배열을 입력받을 때, 배열의 크기가 고정되어 있다면 편하겠지만 그렇지 않은 경우가 많다.
예를 들면 알고리즘 문제를 풀 때 각각의 테스트 케이스에 대해 배열의 크기가 달라지는 경우가 있을 수 있다.
이러한 경우 배열의 길이가 유동적으로 바뀌는 경우, 아무 생각 없이 배열의 크기에 변수를 대입하려 하면 에러가 뜨는 것을 볼 수 있다.
유동적인 크기의 배열을 만들기 위해 vector 헤더를 사용하는 방법도 있겠지만, 지금은 new 와 delete를 이용해 소위 말하는 동적 할당으로 배열을 만드는 법을 알아보자.
#include <iostream>
using namespace std;
int main() {
int arr_size; // 배열의 크기 arr_size 선언
cout << "arr_size : ";
cin >> arr_size; // 배열의 크기 arr_size 입력
int* arr = new int[arr_size]; // new로 배열 크기가 arr_size인 int 배열을 생성!
for (int i = 0; i < arr_size; i++) {
cin >> arr[i];
}
for (int i = 0; i < arr_size; i++) {
cout << i << "번 째 원소는 : " << arr[i] << endl;
}
delete[] arr; // 할당한 메모리 해제 잊지 말기!
return 0;
}
위의 코드를 실행하면 원하는 대로 배열이 입력된 것을 볼 수 있다.
'Language > C++' 카테고리의 다른 글
[C++] 참조자(레퍼런스) (0) | 2022.08.05 |
---|---|
[C++] 자료형 개요(작성중) (0) | 2022.08.01 |
[C++] main 함수란? (0) | 2022.08.01 |
[C++] 변수 선언 (0) | 2022.07.04 |
[C++] 이름공간(namespace) (0) | 2022.07.04 |