• 티스토리 홈
  • 프로필사진
    디지털 블리자드
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
디지털 블리자드
  • 프로필사진
    디지털 블리자드
    • 분류 전체보기 (72) N
      • 과제(숙제) (19)
      • 컴퓨터관련 (21) N
      • 윈도우7 (32)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • 22.06.29 과제
        2022년 06월 30일
        • 디지털 블리자드
        • 작성자
        • 2022.06.30.:43
        728x90

        스마트포인터 정리하기

        스마트 포인터(smart pointer)란?
        자바의 경우 garbage collector를 통해 메모리를 관리하지만 c++은 사용자가 스스로 메모리를 할당 해제를 통해 관리해야 합니다.
        c에서는 malloc, free로 메모리를 할당및 해제를 수행하고 c++은 new, delete를 사용합니다.
        C++ 프로그램에서 new 키워드를 사용하여 동적으로 할당받은 메모리는, 반드시 delete 키워드를 사용하여 해제해야 합니다.
        이때 할당받은 메모리를 해제하지 않을경우 프로그램은 계속 사용하고 있는 메모리로 인지하고 해당 메모리를 사용하지 않는 메모리 누수(memory leak)가 발생하게됩니다.
        C++에서는 메모리 누수(memory leak)로부터 프로그램의 안전성을 보장하기 위해 스마트 포인터를 제공하고 있습니다.
        스마트 포인터(smart pointer)란 포인터처럼 동작하는 클래스 템플릿으로, 사용이 끝난 메모리를 자동으로 해제해 줍니다.
        즉, delete를 자동으로 수행해줍니다.

         

        스마트 포인터의 종류
        C++11 이전에는 auto_ptr이라는 스마트 포인터를 사용하여 이 작업을 수행하였습니다.
        하지만 C++11부터는 다음과 같은 새로운 스마트 포인터를 제공하고 있습니다.
        memory 헤더파일을 include해야 사용 가능합니다.
        스마트 포인터 종류는 다음과 같습니다.
        1. unique_ptr
        2. shared_ptr
        3. weak_ptr

         

        unique_ptr
        unique_ptr은 하나의 스마트 포인터만이 특정 객체를 소유할 수 있도록 객체에 소유권 개념을 도입한 스마트 포인터입니다.
        이 스마트 포인터는 해당 객체의 소유권을 가지고 있을 때만, 소멸자가 해당 객체를 삭제할 수 있습니다.
        unique_ptr 인스턴스는 move() 멤버 함수를 통해 소유권을 이전할 수는 있지만, 복사할 수는 없습니다.
        소유권이 이전되면, 이전 unique_ptr 인스턴스는 더는 해당 객체를 소유하지 않게 재설정됩니다.
        즉 shared_ptr과 다르게 reference count가 1을 넘어갈 수 없습니다.

        사용법

        unique_ptr<객체> 스마트 포인터명(new 객체)
        unique_ptr<객체> 스마트 포인터명 = make_unique<객체>(인수);

        unique_ptr<int> ptr01(new int(5));
        auto ptr02 = move(ptr01); 
         make_shared()함수 처럼 make_unique()함수를 사용하여 안전하게 인스턴스를 생성할 수 있습니다.
         // unique_ptr<int> ptr03 = ptr01;  // 대입 연산자를 이용한 복사는 오류를 발생시킵니다.
        ptr02.reset();                     // ptr02가 가리키고 있는 메모리 영역을 삭제합니다.
        ptr01.reset();                     // ptr01가 가리키고 있는 메모리 영역을 삭제합니다.

         

        shared_ptr
        shared_ptr은 하나의 특정 객체를 참조하는 스마트 포인터가 총 몇 개인지를 참조하는 스마트 포인터입니다.
        참조 카운트란 해당 메모리를 참조하는 포인터가 몇개인지 나타내는 값으로 shared_ptr가 추가될때 1씩 증가하고 수명이 다하면 1씩 감소합니다.
        이렇게 참조하고 있는 스마트 포인터의 개수를 참조 횟수(reference count)라고 합니다.
        따라서 마지막 shared_ptr의 수명이 다하거나 main()함수가 종료되면 참조 카운트가 0이되어 delete를 사용하여 메모리를 자동으로 해제시킵니다.

        사용법
        shared_ptr<객체> 스마트 포인터명(new 객체);
        shared_ptr<객체> 스마트 포인터명 = make_shared<객체>(인수);

        shared_ptr<int> ptr01(new int(5)); // int형 shared_ptr인 ptr01을 선언하고 초기화함.
        cout << ptr01.use_count() << endl; // 1
        auto ptr02(ptr01);                 // 복사 생성자를 이용한 초기화
        cout << ptr01.use_count() << endl; // 2
        auto ptr03 = ptr01;                // 대입을 통한 초기화
        cout << ptr01.use_count() << endl; // 3  

         

        weak_ptr
        weak_ptr은 하나 이상의 shared_ptr 인스턴스가 소유하는 객체에 대한 접근을 제공하지만, 소유자의 수에는 포함되지 않는 스마트 포인터입니다.
        shared_ptr을 사용할때 발생할 수 있는 문제를 해결하기 위해 사용됩니다.
        shared_ptr은 참조 횟수(reference count)를 기반으로 동작하는 스마트 포인터입니다.
        만약 서로가 상대방을 가리키는 shared_ptr를 가지고 있다면, 참조 횟수는 절대 0이 되지 않으므로 메모리는 영원히 해제되지 않습니다.
        이렇게 서로가 상대방을 참조하고 있는 상황을 순환 참조(circular reference)라고 합니다.
        weak_ptr은 바로 이러한 shared_ptr 인스턴스 사이의 순환 참조를 제거하기 위해서 사용됩니다.

         

        참고자료
        http://www.tcpschool.com/cpp/cpp_template_smartPointer
        https://min-zero.tistory.com/entry/C-STL-1-3-%ED%85%9C%ED%94%8C%EB%A6%BF-%EC%8A%A4%EB%A7%88%ED%8A%B8-%ED%8F%AC%EC%9D%B8%ED%84%B0smart-pointer
        https://www.youtube.com/watch?v=DYSEulQoj8Q

        728x90
        저작자표시 비영리 변경금지 (새창열림)

        '과제(숙제)' 카테고리의 다른 글

        2022.07.18 정리  (0) 2022.07.18
        22.07.12 과제  (0) 2022.07.13
        2022.06.21 과제  (0) 2022.06.22
        2022.06.10 숙제  (0) 2022.06.12
        2022.06.08 숙제  (0) 2022.06.09
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바