본문 바로가기

Programming/C/C++

C++/동적 메모리 할당 및 반환

반응형

동적 메모리 할당


프로그래머가 프로그램 작성시 메모리 확보를 위해 변수, 객체, 배열을 정적으로 할당 받는다. 사용자 중심에서 본다면 그 때 그 때 마다 필요한 메모리가 달라지기 때문에 정적으로 할당하기에는 한계가 있다. 즉 프로그램이 실행 중에 필요한 만큼 메모리를 할당받고 필요 없을 때 반환 할 수 있는 '동적 메모리 할당/반환 메커니즘'이 필요하다. 동적 메모리는 C에서는 함수를 통해 C++에서는 연산자를 통해 힙(heap)영역에 할당 된다.


C의 동적 메모리 할당 및 반환

 - malloc() / free()


C++의 동적 메모리 할당 및 반환

 - new / delete

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 *= new int;
if(!p){
    return ;
}
 
*= 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 *= &n;
delete p;
cs


2. 반환한 메모리를 두번 반환하면 실행 오류가 발생한다.


1
2
3
int *= 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 *= 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 *= new int [10];
delete p; // delete [] p;
int *= new int;
delete [] q; // delete q;
cs


반응형