동적 메모리 할당
프로그래머가 프로그램 작성시 메모리 확보를 위해 변수, 객체, 배열을 정적으로 할당 받는다. 사용자 중심에서 본다면 그 때 그 때 마다 필요한 메모리가 달라지기 때문에 정적으로 할당하기에는 한계가 있다. 즉 프로그램이 실행 중에 필요한 만큼 메모리를 할당받고 필요 없을 때 반환 할 수 있는 '동적 메모리 할당/반환 메커니즘'이 필요하다. 동적 메모리는 C에서는 함수를 통해 C++에서는 연산자를 통해 힙(heap)영역에 할당 된다.
C의 동적 메모리 할당 및 반환
- malloc() / free()
C++의 동적 메모리 할당 및 반환
new와 delete의 기본
new 연산자는 데이터타입의 크기 만큼 힙으로 부터 메모리를 할당 그 결과 메모리에 접근 할 수 있는 주소는 포인터 변수가 가진다. delete 연산자는 할당받은 포인터 변수가 가리키는 메모리를 힙으로 반환 한다.
1 2 3 4 5 | int *pInt = new int; Circle *Circle = new Circle(); delete pInt; delete pChar; | cs |
* 힙 메모리가 부족하면 NULL을 리턴한다.
NULL 리턴 체크
1 2 3 4 5 6 7 8 | int *p = new int; if(!p){ return ; } *p = 5; int n = *p; delete p; | cs |
동적 할당 메모리 초기화
1 2 | int *pInt = new int(20); char *pChar = new char('a'); | cs |
delete 사용 시 주의
1.delete로 메모리를 반환 할 떄 동적 메모리를 가리키는 포인터 변수를 반환해야 한다.
일반 포인터 변수를 반환 할 경우 실행 오류가 발생한다.
1 2 3 | int n; int *p = &n; delete p; | cs |
2. 반환한 메모리를 두번 반환하면 실행 오류가 발생한다.
1 2 3 | int *p = new int; delete p; delete p; | cs |
배열의 동적 할당 및 반환
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include <iostream> using namespace std; int main() { cout << "입력할 정수의 개수는? "; int n; cin >> n; if (n <= 0) { return 0; } int *p = new int[n]; if (!p) { cout << "메모리를 할당 할 수 없습니다." << endl; return 0; } for (int i = 0; i < n; i++) { cout << i + 1 << "번째 정수 : "; cin >> p[i]; } int sum = 0; for (int i = 0; i < n; i++) { sum += p[i]; } cout << "평균 = " << sum / n << endl; delete[] p; } | cs |
실행 결과
동적 배열 사용 주의사항
1. 초기화시 초깃값을 지정할 수 없다. 지정 시 구문 오류가 발생.
1 2 | int *pArray = new int[10](20); int *pArray = new int(20)[10]; | cs |
2. 배열을 반환할 때 delete에 []를 생략하면 정상적인 반환이 되지 않는다.
1 2 3 4 | int *p = new int [10]; delete p; // delete [] p; int *q = new int; delete [] q; // delete q; | cs |
'Programming > C/C++' 카테고리의 다른 글
C++/동적 메모리 할당과 메모리 누수(memory leak) (0) | 2017.10.26 |
---|---|
C++/객체와 객체 배열의 동적 생성 및 반환 (0) | 2017.10.26 |
C++/CPPRESTSDK_VisualStudio에 설치 및 라이브러리 관리 (0) | 2017.10.25 |
C++/객체 배열 (0) | 2017.10.23 |
C++/객체 포인터 (0) | 2017.10.23 |