깊은 복사 / 얕은 복사

2022. 4. 18. 07:35C++

얕은 복사 

#include <iostream>

using namespace std;

int main(void)
{
    int *a = new int(5);    //int 만큼의 공간을 힙 영역에 할당하여 5라는 값을 집어 넣고, 주솟값을 a에 넣는다. 
    int *b = new int(3);     

    a=b;    //런타임에러 발생

    delete a;
    delete b; 

    return 0;
}

위의 코드는 런타임 에러를 발생시킨다. 

(물론 컴파일러의 종류, 설정 및 환경에 따라 아무런 문제도 일으키지 않을 수 있다.)

 

이유는 다음의 그림과 같다. 

우리는 a = b 의 연산을 할 때 b의 값을 a의 값에 복사를 하는 값의 복사를 원했을 것이다. 

하지만 a = b 연산을 하면 b의 주솟값이 a에 복사된다. 

 

그렇게 되면 a가 원래 참조하고 있던 영역엔 더이상 접근할 수 없고 b가 참조할 영역에 a와 b가 동시에 참조하게 되는 것이다 .

 

이때 a 를 delete하면 a가 참조했던 영역이 사라진다. 

그리고 b를 delete하게 되면 이미 사라진 영역을 다시 delete하기 때문에 문제가 발생한다. 

또한 원래 a가 참조하고 있던 영역은 delete되지 않은채 남아있는 문제가 발생한다.

이를 얕은 복사라고 한다.

 

 

따라서 우리는 주소가 아닌 값을 복사 하여야 한다.

 

깊은 복사

값을 복사하는 방법은 다음과 같다.

#include <iostream>

using namespace std;

int main(void)
{
    int *a = new int(5);   
    int *b = new int(3);     

    *a = *b;

    delete a;
    delete b;    

    return 0;
}

 

위와 같이 값을 복사하면 주소를 변경하는 것이 아닌 

주소에 있는 값을 변경하는 것이기 때문에 문제가 발생하지 않는다. 

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

C++ 배열에서 데이터를 초과하여 입력한다면?  (0) 2022.04.28
precision, fixed  (0) 2022.04.25
explicit  (0) 2022.04.18
copy constructor  (0) 2022.04.16
학번, 중간성적, 기말성적 입력 프로그램  (0) 2022.04.14