사전적 의미
깊은 복사는 실제로 두 개의 값(인스턴스가) 생성 되는 것이고, 얕은 복사는 원본은 하난데 포인터가 두개인 것이다.
얕은복사로 인한 에러 발생
#include <iostream>
using namespace std;
class CMYData
{
public:
CMYData(int nParam)
{
m_pnData = new int;
*m_pnData = nParam;
};
~CMYData()
{
delete m_pnData;
};
int GetData(void) { return *m_pnData; };
private:
int *m_pnData = nullptr;
};
int main(void)
{
CMYData a(10);
CMYData b(a);
cout << a.GetData() << endl;
cout << b.GetData() << endl;
return 0;
}
위의 코드를 실행하면 인스턴스 b의 소멸자를 Call 할 때 에러가 발생한다.
왜냐?? 진짜 중요한 개념인데 b의 Default 복사 생성자는 포인터를 제대로 처리하지 못하기 때문이다.
좀 더 자세히 말하면 인스턴스 b도 생성 될 때 새롭게 동적 할당 받아서 거기다가 값을 집어 넣야아하는데 Defalut 복사 생성자는 인스턴스 a의 m_pnData 값 즉 a에서 동적 할당 한 값을 그대로 b의 m_pnData에 집어 넣었기 때문이다. 그러니깐 인스턴스 a가 소멸될때 delete를 했는데 b가 소멸될 때 없는 메모리를 delete 하려 하니 에러가 발생하는것!
깊은복사로 에러 탈출!
CMYData(CMYData& rhs)
{
m_pnData = new int;
*m_pnData = *rhs.m_pnData;
}
위와 같은 복사 생성자를 넣어주자. 그럼 인스턴스 b도 생성될때 int 형 만큼의 Heap 메모리를 할당 받아서 그 메모리에 값을 쓴다!
'C++' 카테고리의 다른 글
C++ 임시객체(이동 생성자) 중요! (0) | 2020.02.07 |
---|---|
C++ 대입 연산자 (0) | 2020.02.02 |
C++ 복사 생성자(참조형 파라미터) (0) | 2020.02.01 |
C++ this 포인터 (0) | 2020.02.01 |
C에서 C++ 객체지향의 변환 과정 (0) | 2020.01.28 |