- 얕은 복사
같은 메모리를 참조하여 복사 생성을 합니다.
디폴트 복사 생성자는 얕은 복사입니다. (default 키워드)
- 깊은 복사
얕은 복사를 진행하되, 포인터나 참조한 값들은 새로 메모리를 할당하여 복사 생성을 합니다.
깊은 복사는 직접 프로그래머가 작성해 주어야합니다.
예시코드
class Monster
{
public:
char* name;
int hp;
int damage;
public:
Monster(const Monster& other) = default;
}
코드 설명
이 경우 default로 얕은 복사를 진행할 경우, name은 포인터로 만들어졌으므로
삭제를 진행할 때 같은 메모리를 참조하므로 중복 delete가 진행될 위험이 있습니다.
만약 깊은 복사로 진행할 경우, 아래의 코드처럼 직접 만들어줘야합니다.
Monster(const Monster& other)
{
hp = other.hp;
damage = other.damage;
// 깊은 복사는 포인터나 참조를 한 경우 아래처럼 새 메모리를 할당해줍니다.
name = New char [strlen(other.name) + 1];
strcpy(name , other.name);
}