Notice
Recent Posts
Recent Comments
Link
거의 알고리즘 일기장
얕은 복사와 깊은 복사 본문
1. 얕은 복사와 깊은 복사가 필요한 이유
일반적으로 객체를 복사할때는 새로운 객체를 만들어서 그 안에 복사할 객체들을 복사한다.
이때 밑의 그림과 같은 오해를 할수도 있다
하지만, 참조된 값을 복사하면 밑의 그림과 같이 저런식으로 참조값만 복사가 된다.
이게 뭐가 문제냐?? 라고 생각할수도 있지만 충분히 문제가 생길수 있다.
예를들면 만약 하나의 클래스가 있고 A와 B는 그 클래스의 인스턴스이다. 그리고 B는 A의 값을 복사했다.
이때 소멸자에 클래스 포인터 변수를 delete 시켜주는 기능이 있다면 A가 소멸할땐 문제가 없겠지만 뒤이어 B가 소멸할때 분명히 에러가 날것이다. ( 밑의 코드 참조 )
#include <iostream>
using namespace std;
class A
{
public:
int value;
char* name;
public:
A(int value_in, const char* name_in)
{
value = value_in;
name = new char[strlen(name_in) + 1];
strcpy_s(name, strlen(name_in)+1, name_in);
}
~A()
{
cout << "destructor" << endl;
delete name;
}
void ShowA()
{
cout << "value : " << value <<endl;
cout << "name : " << name << endl;
}
};
int main()
{
A a1(5, "jackjack");
A a2 = a1;
a1.ShowA();
a2.ShowA();
return 0;
}
2. 깊은 복사
이제 이 문제를 어떻게 해결하면 좋을까?
바로 복사할때 이 형태를 만들면 된다. ( 밑의 코드 참조 )
#include <iostream>
using namespace std;
class A
{
public:
int value;
char* name = nullptr;
public:
A(int value_in, const char* name_in)
{
value = value_in;
name = new char[strlen(name_in) + 1];
strcpy_s(name, strlen(name_in) + 1, name_in);
}
//대입 생성자 , 깊은 복사
A(const A& a)
{
value = a.value;
name = new char[strlen(a.name) + 1];
strcpy_s(name, strlen(a.name) + 1, a.name);
}
~A()
{
cout << "destructor" << endl;
delete name;
}
//대입 연산자 수정
A& operator =(const A& a)
{
if (name != nullptr)
delete name;
value = a.value;
name = new char[strlen(a.name) + 1];
strcpy_s(name, strlen(a.name) + 1, a.name);
}
void ShowA()
{
cout << "value : " << value << endl;
cout << "name : " << name << endl;
}
};
int main()
{
A a1(5, "jackjack");
A a2(a1);
a1.ShowA();
a2.ShowA();
return 0;
}
3. 후기
나도 까먹었어서 공부할겸 포스팅했다. 블로그에 글을 쓰는게 시간이 좀 걸리긴 하지만 공부에 도움이 되는것 같다.
이 포스트는 개인공부용으로 작성하였습니다.
미숙해서 틀린부분이 있을수도 있는데 말해주시면 수정하겠습니다.
반응형
'c++ 문법' 카테고리의 다른 글
입출력 관련 함수들 (setw, setprecision, get, getline, ignore, putback, unget, peek) (0) | 2020.04.17 |
---|---|
string의 사용방법들 (예제) (0) | 2020.04.16 |
STL 반복자 _ iterator (0) | 2020.04.12 |
순환의존성과 weak_ptr (0) | 2020.04.12 |
Lvalue와 Rvalue (0) | 2020.04.07 |
Comments