.

(C++) 얕은 복사/깊은 복사

얕은 복사

객체를 복사할 때 객체의 구성원을 1:1로 복사

>> 객체의 멤버 변수에 동적 메모리를 할당하면 원래 메모리를 공유합니다.

>> 얕은 복사로 생성된 객체가 소멸되면 원본 객체의 동적 메모리도 함께 소멸됩니다.

class Circle{
	int radius;
public:
	getArea();
	Circle() : Circle(1) {}
	Circle(int radius){
	this->radius = radius;
}
	Circle(const Circle& c){ // 복사 생성자
	this->radius = c.radius; // 사본의 radius는 객체의 radius가 된다.
	}
};

** 복사 생성자가 선언되지 않은 경우 컴파일러는 기본 복사 생성자를 삽입합니다(얕은 복사).

깊은 복사

복사는 원본의 메모리 크기만큼 따로따로 작동하여 내용을 복사합니다.


문제





딸 개체는 아버지를 복사하여 만든 개체입니다. 이 코드에서는 복사 생성자를 지정하지 않았으므로 기본 복사 생성자가 실행되고 멤버 포인터 배열명의 동적으로 할당된 메모리 주소가 그대로 복사됩니다.

따라서 먼저 딸 개체가 사라지면 소멸자가 실행되고 동적 메모리 주소가 지워집니다.

아버지가 파괴되면 동적 메모리는 삭제되지만 삭제할 값이 없기 때문에 오류가 발생합니다.




이를 해결하기 위해 복사 생성자를 만듭니다.

1. 복사본에 새로운 동적 공간을 할당하고 원본의 이름 길이(+1)만큼 복사본에 새로운 동적 공간을 생성합니다.

2. 원본 이름의 값을 복사본의 동적 공간 이름에 복사