본문 바로가기

Programming/C/C++

복사생성자와 얕은복사

복사생성자

클래스를 선언할때 생성자에서 요구하는 멤버변수가 아닌 경우 에러를 발생한다.

이는 당연한 것인데 아래와 같은 경우 에러를 발생시키지 않고 실행이 된다.

코드의 내용과 출력결과를 보면 객체의 멤버변수의 내용을 복사해 온 것을 알 수 있다.

자기자신과 같은형태의 클래스를 인수로 받을 수 있는 것을 복사 생성자라고 하며, 위에서 따로 생성자를 만들어 주지 않아도 알아서 내용을 복사 한 것은 클래스의 멤버 변수 대 멤버 변수의 복사를 수행하는 디폴트 복사 생성자가 있기 때문이다.

사실은 이러한 형태의 복사 생성자가 클래스의 형태에 따라 각각 있는 것이다.


얕은 복사로 인한 문제

이렇게 봤을때는 디폴트 복사 생성자가 알아서 멤버변수들을 복사 하기 때문에 복사생성자를 사용자가 입력 할 필요가 없을 듯 싶지만 디폴트 복사 생성자가 문제가 일으킬 때가 있다.

위의 코드를 빌드 하게 되면 오류가 없다고 나오지만 프로그램 실행시 런타임 에러를 뱉어낸다.


p1("Jang", 26)이란 부분은 동적할당을 통해 heap영역에 "Jang"이라는 값을 복사하도록 하고 또 26이라는 값을 복사하게 된다는 것을 알 수 있다.

그 다음으로 p2는 p1의 멤버변수들의 내용을 복사하게 되는데 p2의 name은 p1이 가리키고 있는 주소값을 복사하게 되며, 이렇게 주소값만 복사하는 것을 얕은복사라 하며 문제는 여기서 생긴다.

p1, p2순으로 생성하게되면 p2, p1순으로 소멸하게되는데 먼저 p2의 소멸자가 heap영역의 생성된 메모리공간을 소멸 시킨다.

그 후에 p1이 메모리 소멸을 위해 해당 주소로 갔을때는 이미 p2의 소멸자가 메모리공간을 소멸 시킨 이후이기 때문에 문제가 발생하는 것이다.


따라서 위처럼 따로 복사생성자를 생성하여 p1의 name의 주소값이 아닌 문자열을 복사하도록 하여 따로 heap영역에 메모리를 할당하여야 얕은 복사로 인한 메모리 참조 문제를 피할 수 있다.

'Programming > C/C++' 카테고리의 다른 글

클래스와 static  (0) 2015.01.15
클래스와 const  (0) 2015.01.15
friend 선언  (0) 2015.01.14
class의 정보은닉과 캡슐화  (0) 2015.01.13
reference와 pointer의 차이  (0) 2015.01.13