본문 바로가기
IoT 디바이스 활용/C++

C++ - 동적 할당 메모리

by cooluk 2020. 10. 12.

동적 할당 메모리

  • 프로그램에서의 메모리

    • 스택(Stack)

      • 지역 변수 할당 (정적할당)
      • 시스템에 의해 관리
    • 힙(Heap)

      • 동적 메모리 할당
      • 개발자에 의해 관리

      image-20200908162441461


  • new, delete

    • new

      • 동적으로 힙에 메모리를 할당
    • delete

      • 동적으로 힙에 할당된 메모리를 회수
      • 파괴자가 호출됨
      • 동적 메모리를 회수 하지않으면 가비지(garbage) 증가 -- 메모리 누수
    • class T {};
      T *p = new T;
      T *p = new T[N];
      T *p = new T[N] { initializer1, ... , initializeerN}; 
    • int *p;
      p = new int[5]; 
      
      int *p = new int[5] {0, 1, 2, 3, 4};
    • int *p = new int;
      :
      delete p; // 단일 데이터 삭제
      
      int *p = new int[5] {0, 1, 2, 3, 4};
      delete [] p; // 배열 데이터 삭제

    new, delete

    #include <iostream>
    #include <time.h>
    using namespace std;
    
    int main() {
        int *ptr;
    
        srand(time(NULL));
        ptr = new int[10];
        // ptr은 할당된 동적 메모리의 시작 주소,
        // 따라서 ptr은 첫 번째 엘리먼트(ptr[0])에 대한 포인터
        // *ptr은 ptr[0]과 같음
    
        for (int i = 0; i < 10; i++) {
            ptr[i] = rand();
        }
    
        for (int i = 0; i < 10; i++) {
            cout << ptr[i] << " ";
        }
        cout << endl;
    delete []ptr;
        return 0;
    }

    10172 30097 1329 24679 4151 23900 15709 28541 10597 30398



    가비지(garbage)

    #include <iostream>
    #include <time.h>
    using namespace std;
    
    int main() {
        int *ptr = new int;
        *ptr = 99;
        return 0;
    }


  • 스마트 포인터

    • 포인터의 동적 메모리 회수자동으로 처리해줌

      • 포인터 변수가 제거될 때 자동으로 delete 호출
    • #include <memory> 추가 후 사용

    • unique_ptr

      • 포인터에 대해 오직 하나의 소유자만 허용

      unique_ptr buf(new int[10]);

    • shared_ptr

      • 참조 횟수가 계산되는 스마트 포인터
#include <iostream>
#include <memory>
using namespace std;
int main()
{
    unique_ptr<int[]> buf(new int[10]);
    for (int i = 0; i < 10; i++)
    {
        buf[i] = i;
    }

    for (int i = 0; i < 10; i++)
    {
        cout << buf[i] << " ";
    }
    cout << endl;
    return 0;
}

0 1 2 3 4 5 6 7 8 9



'IoT 디바이스 활용 > C++' 카테고리의 다른 글

C++ - 복사생성자와 정적멤버  (0) 2020.10.12
C++ - 객체의 동적 생성  (0) 2020.10.12
C++ - 포인터  (0) 2020.10.12
C++ - 객체 배열, 벡터  (0) 2020.10.12
C++ - 객체와 함수  (0) 2020.10.12

댓글