(C++ : Move Semantics-2) Move Semantics란?

Posted by : at

Category : Cpp


class Cat
{
  char* name;
  int age;
public:
  Cat(const char* n, int a) : age(a)
  {
    name = new char[strlen(n) + 1];
    strcpy(name, n);
  }
  ~Cat() { delete[] name; }
};

int main()
{
  Cat c1("NABI", 2);

  // runtime error - 디폴트 복사 생성자로 메모리 주소를 그대로 복사, delete할때 에러가 발생
  Cat c2 = c1;
}
// 깊은 복사로 만들어보자.
Cat(const Cat& c) : age(c.age)
{
  name = new char[strlen(c.name) + 1];
  strcpy(name, c.name);
}
Cat foo()   // 값리턴 : 임시객체(rvalue)
{
  Cat cat("NABI", 2);
  return cat;
}

int main()
{
  Cat c = foo();    // 임시객체. 다음줄에서 메모리 할당 해제 됨.
  // 그런데 어차피 소멸될 메모리인데 깊은 복사 말고 얕은 복사를 하면 메모리 할당해제 안해도 되고 좋을꺼 같은데??
  // -> move semantics
}
// 소유권 이전(자원전달)의 이동(move) 생성자
// 임시객체일때만 사용되게 만들어야함. -> rvalue reference로 받자
Cat(Cat&& c) : age(c.age), name(c.name)
{
  c.name = 0;   // 자원 포기
}

// 여기서 이런 의문이 들수 있음 &&이 뭔데?
// 그냥 r-value reference를 받을 수 있는 문자라 생각하자
// 정리
class Test
{
  int* resource;
public:
  Test() {}
  ~Test() {}
  Test(const Test& t) { cout << "Copy" << endl; }
  
  // Move 생성자 : 소유권 이전(자원 전달)
  Test(Test&& t) { cout << "Move" << endl; }
};

int main()
{
  Test t1;
  Test t2 = t1;
  Test t3 = Test();
}

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links