| 특징 | 얕은 복사 | 깊은 복사 |
|---|---|---|
| 메모리 공유 여부 | 원본과 복사본이 같은 메모리 주소를 공유 | 원본과 복사본이 독립적인 메모리 공간을 가짐 |
| 메모리 관리 | 관리가 어렵고, 충돌 및 누수 가능성 있음 | 안전하며 충돌 가능성 없음 |
| 복사 속도 | 빠름 | 상대적으로 느림 |
| 사용 예시 | 단순 값 복사에 적합 | 동적 메모리를 포함한 객체에서 필수적 |
#include <string>
using namespace std;
class Pet
{
public:
Pet() {}
~Pet() {}
public:
int _age;
int _name;
};
class Person
{
public:
Person() : _age(0), _name("")
{
_pet = new Pet;
cout << "Person 얕은 복사" << endl;
}
~Person()
{
cout << "Person 소멸자" << endl;
delete _pet;
}
public:
int _age;
string _name;
Pet* _pet;
};
int main()
{
Person p1 = Person();
Person p2 = p1; // 얕은 복사 발생
}
p1 객체 생성:
Person 생성자가 호출되어 _pet 멤버가 동적으로 할당.Person 얕은 복사.p2 객체 복사:
p1._pet과 p2._pet이 같은 메모리 주소를 가리킴.문제점:
p1이나 p2 중 하나가 소멸되면, _pet의 메모리가 해제됨.#include <iostream>
#include <string>
using namespace std;
class Pet
{
public:
Pet() {}
~Pet() {}
public:
int _age;
int _name;
};
class Person
{
public:
Person() : _age(0), _name("")
{
_pet = new Pet;
cout << "Person 얕은 복사" << endl;
}
// 복사 생성자
Person(const Person& other)
{
_age = other._age;
_name = other._name;
_pet = new Pet; // 새로운 메모리 공간 할당
cout << "Person 깊은 복사" << endl;
}
~Person()
{
cout << "Person 소멸자" << endl;
delete _pet; // 메모리 해제
}
public:
int _age;
string _name;
Pet* _pet;
};
int main()
{
Person p1 = Person();
Person p2 = Person(p1); // 깊은 복사 발생
}
p1 객체 생성:
Person 생성자가 호출되어 _pet 멤버가 동적으로 할당.Person 얕은 복사.p2 객체 복사:
_pet 멤버가 새로운 메모리 공간을 가지며, 원본과 복사본은 독립적임.Person 깊은 복사.안전성:
p1과 p2의 _pet은 독립적인 메모리 공간을 가지므로, 한 객체가 소멸되어도 다른 객체에 영향을 주지 않음.