class A{
public:
shared_ptr<B> classB;
};
class C{
public:
shared_ptr<B> classB;
void init(shared_ptr<B> pB){
if(classB == nullptr){
classB = std::move(pB);
}
};
};
class B {
public:
B();
string str;
};
클래스 A, B, C를 생성
클래스 A와 C는 클래스 B를 필드로 받고 있음
int main() {
A class_a = A();
class_a.classB = make_shared<B>();
C class_c = C();
class_c.init(class_a.classB);
cerr << class_a.classB->str << endl;
cerr << class_c.classB->str << endl;
return 0;
}
이때, 위와같이 클래스 A에서 필드값 B클래스의 객체를 생성하고 이를 C클래스의 멤버함수 init으로 초기화 한다면 init 인자값으로 받은 shared_ptr은 객체가 복사되어 클래스 C의 필드 B로 들어가게 되어 문제없이 출력이 됨
즉, 멤버함수의 인자로 받게 되는 순간 포인터 값의 복사가 일어나고 이 복사된 값을 move로 이동해도 원본값에 변화는 없다
int main() {
A class_a = A();
class_a.classB = make_shared<B>();
C class_c = C();
class_c.classB = move(class_a.classB);
//cerr << class_a.classB->str << endl; segmentation fault 발생
cerr << class_c.classB->str << endl;
return 0;
}
반면, 위와 같이 직접적으로 전달을 해주게 될 경우, 클래스A의 객체는 자신의 B클래스 객체를 전달해줌으로 그대로 이 값을 출력하게 될 경우 segmentation fault가 발생하게 됨