- [Modern C++ 정리] Move 32022년 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일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)