C,C++

공부하면서 빠트린 것들 끄적끄적 - 얕은 복사 vs 깊은 복사

미오29살 2023. 9. 25. 13:48
  • 얕은 복사
    같은 메모리를 참조하여 복사 생성을 합니다.
    디폴트 복사 생성자는 얕은 복사입니다. (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);
}