본문 바로가기

컴퓨터

2-7. new & delete

new와 delete 연산자의 기본적 기능

메모리를 동적으로 할당 및 소멸하기 위해서 C에서 malloc과 free함수를 썼다면 C++ 에선 new와 delete 키워드가 이 두 함수를 대신한다.

int * val = new int; //int형 테이터 1개 저장을 위한 메모리 할당
int * arr = new int[size]; //길이가 size인 int형 배열을 위한 메모리 할당
delete val; //val이 가리키는 메모리 반환
delete []arr; //arr이 가리키는 배열 반환

1: int형 데이터 하나를 저장할 수 있는 메모리 공간을 동적할당 하라는 선언이다. 힙 영역에 4byte 메모리 공간이 할당될 것이고, 할당된 메모리 공간의 주소 값 반환이 이루어진다. C의 malloc 함수는 주소 값을 void 포인터(void*) 형으로 반환하기 때문에 형 변환을 해야만 했던 것과 다르다.

2: 배열을 할당하는 방법이다. 

3: new 연산자에 의해 할당된 메모리 공간을 해제할 때는 delete 연산자를 사용하면 된다. val이라는 포인터가 가리키는 메모리 공간을 반환한다. int형이므로 val의 주소를 시작으로 4byte가 반환될 것이다.

4: 할당된 메모리 공간이 배열일 경우는 포인터 앞에 인데스 기호([ ])가 있다. 2차원 배열이건, 3차원 배열이건 배열을 해제할 때는 이와 같이 요구하면 된다. 참고로 delete[] arr; delete []arr; delete [] arr; 다 같은 의미이다.

#include <iostream>
using std::cin;
using std::cout;
using std::endl;

int main(void) {
	int size;
	cout << "할당하고자 하는 배열의 크기: ";
	cin >> size;

	int* arr = new int[size]; //배열의 동적 할당
	if (arr == NULL) {//동적 할당 검사
		cout << "메모리 할당 실패" << endl;
		return -1; //프로그램 종료
	}

	for (int i = 0; i < size; i++)
		arr[i] = i + 10;

	for (int j = 0; j < size; j++)
		cout << "arr[" << j << "]=" << arr[j] << endl;

	delete[]arr; //할당된 메모리 소멸
	return 0;
}

12~15: 메모리를 할당만 하고, 적절히 소멸해 주지 않을 경우에 메모리 공간이 여의치 않아 메모리 할당이 실패할 수도 있다. 이러한 경우 new 연산자는 NULL 포인터를 리턴한다. 이를 이용하여 메모리 할당 검사를 실시하는 부분이다.

마지막으로 new 와 delete는 malloc과 free함수로는 할 수 없는 객체의 동적 생성에 관련된 기능이 있다.

'컴퓨터' 카테고리의 다른 글

3-3. 클래스 멤버의 접근 제어  (0) 2019.04.07
3-2. 클래스와 객체  (0) 2019.04.07
2-5 레퍼런스를 이용한 성능의 향상  (0) 2019.04.06
2-4. 레퍼런스와 함수  (0) 2019.04.05
2-3 레퍼런스(Reference)의 이해  (0) 2019.04.05