복사 생성자 (Copy Constructor)
- 새로운 객체를 생성할 때, 다른 객체의 값을 복사하여 새로운 객체를 초기화 해주는 생성자.
- 기본적으로, 자기 자신의 클래스를 참조로 받는다.
- 복사 생성자가 클래스에 정의되어 있지 않은 경우, 컴파일러가 자동으로 만들어줌.
얕은 복사 (Shallow Copy)
- 복사 생성자로 만들어진 객체들의 멤버 포인터 변수 값이 동일함.
- 객체들이 사용하는 포인터 변수의 메모리 주소가 동일하므로, Use-After-Free와 같은 문제점 발생 가능.
예제 코드
#include <iostream>
using namespace std;
class Pet
{
public:
int _hp = 10;
};
class Knight
{
public:
Knight()
{
_pet = new Pet();
}
Knight(const Knight& knight)
{
_pet = knight._pet;
}
~Knight()
{
delete _pet;
}
public:
Pet* _pet;
};
int main()
{
Knight k1;
Knight k2(k1);
return 0;
}
결과
- 각각의 k1, k2 객체가 가리키는 _pet의 주소가 동일함.
깊은 복사 (Deep Copy)
- 복사 생성자로 만들어진 객체들의 멤버 포인터 변수 값이 각각 다름.
- 각 객체들의 멤버 포인터 변수가, 서로 다른 메모리 주소를 가지고 있음.
- 얕은 복사의 문제 해결.
예제 코드
#include <iostream>
using namespace std;
class Pet
{
public:
int _hp = 10;
};
class Knight
{
public:
Knight()
{
_pet = new Pet();
}
Knight(const Knight& knight)
{
_pet = new Pet();
}
~Knight()
{
delete _pet;
}
public:
Pet* _pet;
};
int main()
{
Knight k1;
Knight k2(k1);
return 0;
}
결과
- 각각의 k1, k2 객체가 가리키는 _pet의 주소가 서로 다름.