C++에서는 동적 메모리 할당 및 반환을 위해
new와 delete 연산자를 이용한다.
new 연산자는 힙(heap)이라는 공간으로부터 메모리를 할당받고,
delete 연산자는 할당받은 메모리를 힙으로 반환한다.
new와 delete의 기본 활용
데이터타입 *포인터변수 = new 데이터타입;
delete 포인터변수;
new 연산자는 '데이터타입'의 크기만큼 힙으로부터 메모리를 할당받고 주소를 리턴한다.
그 결과 '포인터변수'는 할당받은 메모리의 주소를 가진다.
delete 연산자는 '포인터변수'가 가리키는 메모리를 힙으로 반환한다.
'데이터타입'은 int,char,double 등 기본 타입뿐 아니라 구조체,클래스도 포함한다.
int *pInt=new int;
char *pChar=new char;
Circle *pCircle=new Circle();
delete pInt;
delete pChar;
delete pCircle;
동적 할당 메모리 초기화
new를 이용하여 메모리를 할당받을 때, 아래와 같이 '초깃값을' 지정하여 초기화할 수 있다.
데이터타입*포인터변수=new 데이터타입(초깃값);
다음은 동적 할당을 받으면서 20과 'a' 문자로 초기화하는 예이다.
int *pInt=new int(20); // 20으로 초기화된 int 공간 할당
char *pChar=new char('a'); // 'a'로 초기화된 char 공간 할당
delete 사용 시 주의
delete로 메모리를 반환할 때 적절하지 못한 포인터를 사용하면, 실행 오류가 발생한다. 다음 코드는 동적으로 할당받지 않는 메모리를 반환하여 실행 오류가 발생한다. 또한 메모리를 한번 반환하면, 중복 반환은 불가능.
int n;
int *p=&n;
delete p; // 실행 오류, p 가 가리키는 메모리는 동적 할당받은 것이 아님
배열의 동적 할당 및 반환
new와 delete 연산자로 배열을 할당받고 반환할 수 있다.
-배열의 동적 할당 반환의 기본 형식
데이터타입*포인터변수= new 데이터타입 [배열의 크기]; // 배열의 동적 할당
delete [] 포인터변수; // 배열 메모리 반환
---------예시----------
int *p= new int [5];
if(!p)
return; //메모리 할당 실패
for(int i=0;i<5;i++)
p[i]=i; // 배열에 순서대로 0, 1, 2, 3, 4를 기록한다.
delete [] p; //배열 메모리 반환
- 배열을 초기화할 때 주의사항
new로 배열을 동적 할당받을 때 아래와 같이 생성자를 통해 직접 '초깃값'을 지정할 수 없다.
int *pArray=new int [10](20); //구문 오류, 배열의 초기화는 불가
int *pArray=new int(20)[10]; //구문 오류
하지만 다음과 같이 초깃값을 지정할 수 있다.
int *pArray=new int[] {1,2,3,4} // 1,2,3,4로 초기화된 정수 배열 생성
-배열을 delete할 때 주의사항
int *p= new int [10];
delete p; // 비정상 반환, delete [] p;로 해야 한다.
int *q= new int;
delete [] q; // 비정상 반환, delete q;로 해야 한다.
'Programming Language > C++' 카테고리의 다른 글
| this의 기본 개념 (0) | 2023.04.07 |
|---|---|
| 객체 배열의 동적 생성 및 반환 (0) | 2023.04.06 |
| 객체 배열 (0) | 2023.04.06 |
| C++ 객체 포인터와 객체 배열, 객체의 동적 생성 (0) | 2023.04.06 |
| C++ 클래스와 객체 (0) | 2023.04.06 |