본문 바로가기

C,C++

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

  • 얕은 복사
    같은 메모리를 참조하여 복사 생성을 합니다.
    디폴트 복사 생성자는 얕은 복사입니다. (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);
}

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

함수 객체  (0) 2022.11.03
함수 포인터  (0) 2022.11.02
함수 템플릿  (0) 2022.11.01
클래스 템플릿  (0) 2022.11.01