Software/C++

[C++ 기초] 12. new 연산자와 delete 연산자

리미와감자 2023. 3. 20. 02:46

new 연산자

정의

데이터형의 크기를 확인하여 메모리 공간을 할당하는 연산자(동적메모리 할당)

 

절차

1. 어떤 데이터형과 크기를 원하는지 new 연산자에게 알려준다.
2. new 연산자는 그 데이터형과 크기에 맞는 메모리 블록을 만든다.
3. 메모리 블록의 주소를 리턴한다.

 

 

메모리 접근 방법 차이

 

1. 포인터 변수 초기화(정적메모리 할당)

int a;
int* b = &a;
// 메모리 접근 방법(c style) : 1. b    2. a의 주소

 

2. new 연산자(동적메모리 할당)

int* pointer = new int; // 4byte 메모리 블록 생성
// 메모리 접근 방법 : 포인터 변수인 pointer

 

c++에서는 new 연산자를 사용하지만, c에서는 malloc()이라는 함수를 사용하여 동적메모리 할당을 진행한다.

 

 

 

 

 

 

delete 연산자

정의

사용한 메모리를 다시 메모리 풀로 반환하는 연산자

delete pointer; // 반드시 반환해야한다.

 

규칙

1. new로 대입하지 않은 메모리는 delete로 해제할 수 없다.
2. 같은 메모리 블록을 연달아 두 번 연속 delete로 해제할 수 없다.
3. new[]로 메모리를 대입할 경우 delete[]로 해제한다.
4. new[]를 사용하지 않으면 delete[]를 사용할 수 없다.

 

 

 

Code

#include <iostream>

using namespace std;

int main() {

    double* p3 = new double[3]; // double형 데이터 3개를 저장할 메모리 공간 대입
    p3[0] = 0.2;
    p3[1] = 0.5;
    p3[2] = 0.8;

    cout << "p3[1] is " << p3[1] << ".\n";

    p3 = p3 + 1; // 포인터를 증가시킨다. p3의 시작 주소가 증가하게 된다.

    cout << "Now p3[0] is " << p3[0] << " and "; // 0.2가 아닌 0.5
    cout << "p3[1] is " << p3[1] << "\n."; // 0.5가 아닌 0.8
    
    p3 = p3 - 1; // 다시 시작 주소 원상복귀
    delete[] p3; // 메모리 해제


    return 0;
}

 

결과

더보기

p3[1] is 0.5.
Now p3[0] is 0.5 and p3[1] is 0.8