ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C++ 포인터와 메모리 해제 (2)
    C++ 2025. 3. 18. 18:01

    new 연산자

    어떤 데이터형을 원하는지 new 연산자에게 알려주면, new 연산자는 그에 알맞은 크기의 메모리 블록을 찾아내고 그 블록의 주소를 리턴한다.

    int* pointer = new int;

    new int를 하게되면 int형 데이터를 저장할 수 있는 새로운 메모리가 필요하다는 것을 의미한다.

    pointer는 새로운 데이터 객체를 가리키고있다.

    delete 연산자

    사용한 메모리를 다시 메모리 폴로 환수하며 환수된 메모리는 프로그램의 다른 부분이 다시 사용한다.

    int* ps = new int;
    // 메모리 사용
    delete ps;

    new를 사용했으면 delete를 해서 동적으로 할당된 메모리공간을 해제하자.

    그렇지 않으면 나중에 메모리 누수가 발생할 수 있다.

    1. new로 대입하지 않은 메모리는 delete로 해제할 수 없다.

    2. 같은 메모리 블록을 연달아 두 번 delete로 해제할 수 없다.

    3. new[]로 메모리를 대입할 경우 delete[]로 해제한다.

    4. 대괄호를 사용하지 않았다면 delete도 대괄호를 사용하지 않아야 한다.

    #include <iostream>
    #include <cstring>
    
    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] << endl;
    
        p3 = p3 + 1;
    
        cout << "Now p3[0] is " << p3[0] << endl;
        cout << "p3[1] is " << p3[1] << ".\n";
    
        p3 = p3 -1;
    
        delete[] p3;
    
        return 0;
    }

    먼저 p3라는 포인터 배열 3칸을 동적으로 할당하였다. 이렇게 되면 제일 초기 p3는 p3[0]의 주소값을 가리키게 된다. 똑같이 *p3을 찍어보면 p3[0]의 주소값이 아닌 값을 가져온다.

    따라서 p3 = p3 + 1을 하면, p3[0]이 아닌 p3[1]을 가리킨다.

    마무리로 아까 할당했던 메모리공간을 해제 해주는것을 까먹지말자.

     

    나는 아직 출력할때 간접참조 연산자를 붙이고 안붙이고의 차이점이 헷갈린다.

    그러나 값을 변경하거나, 값의 결과를 출력할때는 *를 붙이고, 붙이지 않는다면 해당 값이 아닌 주소값을 가져오는 것으로 이해했다.

     

    'C++' 카테고리의 다른 글

    C++ 반복문 (1)  (0) 2025.03.20
    C++ 포인터 연산  (0) 2025.03.18
    C++ 포인터와 메모리 해제 (1)  (0) 2025.03.18
    C++ 공용체와 열거체  (0) 2025.03.18
    C++ 구조체  (0) 2025.03.18
Designed by Tistory.