C++ 스마트 포인터와 move 사용 예

gyubong park·2021년 4월 28일
0
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가 발생하게 됨

profile
초보 개발자

0개의 댓글

Powered by GraphCDN, the GraphQL CDN