• 티스토리 홈
starryeye
  • 프로필사진
    starryeye
    • 분류 전체보기 (189)
      • C++ (17)
      • Java (24)
      • OOP (5)
      • Spring Reactive Stack (12)
        • Reactive Streams (3)
        • Netty (4)
        • Reactor (1)
        • Webflux (3)
        • DB, Cache 연동 (1)
      • Spring (90)
        • Core (17)
        • MVC (33)
        • Client (2)
        • Security (4)
        • DB, Cache 연동 (33)
      • DataBase (12)
        • RDBMS (2)
        • NoSQL (10)
      • Message Broker (6)
      • Web (4)
      • Network (4)
      • 대규모 시스템 설계 (15)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • [Modern C++ 정리] Move 3
        2022년 09월 08일
        • starryeye
        • 작성자
        • 2022.09.08.:58

        move를 알아보기 위해 먼저 copy를 알아보자..

         

        위 코드의 문제점에 대해 알아보자..

        main() 함수에서..

        Cat 클래스의 c1 이라는 지역 객체 를 선언 하였다.

        c2라는 지역 객체를 선언하고 c1으로 복사 대입 연산자로 초기화 하였다.

         

        <참고>

        C++에서는 복사 대입 연산자로 초기화 할 경우, 복사 생성자가 호출 된다.

        Cat 클래스에서 현재 복사 생성자가 없는데

        이때 컴파일러가 생성해준다.

        생성해주는 복사 생성자는 얕은 복사로 생성된다.

         

        그래서 해당 코드의 문제는

        복사 생성자(얕은 복사)로 c2가 초기화 되기 때문에..

        c1의 포인터 변수 name 과 c2의 포인터 변수 name이 동일한 값을 가지게 된다.

         

        그리고..

        main() 함수 블럭이 끝날 때..

        c1, c2의 소멸자가 불리게 되는데..

        c1 소멸자에서 포인터 변수 name이 메모리 해제가 되고..

        c2 소멸자에서도 포인터 변수 name이 메모리 해제가 된다..

         

        결국

        동일한 주소의 메모리 해제가 2회 일어나므로 runtime에 해당 프로그램은 죽는다.

         

         

        해결법

        위 문제의 해결을 위해서는..

        컴파일러가 자동으로 제공하는 복사 생성자(얕은 복사)를 사용하지 않도록

        깊은 복사를 사용하는 복사 생성자를 제공해야 한다.

         

        코드로 구현해보자..

        복사 생성자(깊은 복사 사용)를 제공한 코드이다..

        이제 main() 함수 블럭이 끝날때 c1, c2의 소멸자가 각각 불려도

        서로 다른 메모리 주소를 각각 해제 하기 때문에

        runtime에 죽지 않는다.

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

        [Modern C++ 정리] Move 4  (0) 2022.09.08
        [Modern C++ 정리] Move 2  (0) 2022.09.08
        [Modern C++ 정리] Move 1  (0) 2022.09.07
        [Modern C++ 정리] Temporary 6  (0) 2022.09.06
        [Modern C++ 정리] Temporary 5  (0) 2022.09.06
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바