class MyClass {
public:
MyClass(const MyClass& other) { /* 복사 생성 로직 */ }
};
void swap(MyClass& a, MyClass& b) { /* 교환 로직 */ }
class MyClass {
public:
MyClass(MyClass&& other) { /* 이동 생성 로직 */ }
};
class MyClass {
public:
MyClass(const MyClass& other); // 복사 생성자
MyClass& operator=(const MyClass& other); // 복사 할당 연산자
~MyClass(); // 소멸자
};
복사 생성자(copy-constructor)
복사 할당(copy-assignment)
소멸자(destructor)
이동 생성자(move-constructor)
이동 할당(move-assignment)
class MyClass {
public:
MyClass(MyClass&& other); // 이동 생성자
MyClass& operator = (MyClass&& other); // 이동 할당 연산자
// 복사 생성자, 복사 할당 연산자, 소멸자 포함
};
Syntax vs semantics
void process(MyClass&& rref) { /* r-value 참조 로직처리*/ }
MyClass::MyClass(MyClass&& other) { /* 이동 생성 로직 */ }
MyClass& MyClass::operator=(MyClass&& other) { /* 이동 할당 로직 */ }
MyClass a;
MyClass b = std::move(a); // 'a'의 자원을 'b'로 이동
#include <iostream>
#include <memory> // for std::unique_ptr
class Resource {
public:
Resource() { std::cout << "Resource acquired\n"; }
~Resource() { std::cout << "Resource destroyed\n"; }
void sayHi() { std::cout << "Hi\n"; }
};
int main() {
{
std::unique_ptr<Resource> res(new Resource()); // Resource 객체를 생성하고 그 소유권을 res에 할당
res->sayHi(); // res를 통해 Resource의 멤버 함수 사용
// res는 자동으로 메모리를 해제합니다. 명시적으로 delete를 호출할 필요가 없습니다.
} // res가 스코프를 벗어나면서 Resource 객체는 자동으로 소멸됩니다.
std::cout << "End of main\n";
// Resource가 이미 소멸되었기 때문에 아무 일도 일어나지 않습니다.
return 0;
}
#include <iostrem>
#include "Resource.h"
int main(){
Resource *res = new Resource(3);
res -> setAll(1);
std::shared_ptr<Resource> ptr1(res); # 몇군데에서 공유되고 있는지 센다.
// auto ptr1 = std::make_shared<Resource>(3); 이 방법이 더 많이 사용된다.
// ptr1 -> setAll(1);
ptr -> print();
{
std::shared_ptr<Resource> ptr2(ptr1);
ptr2->setAll(3);
ptr2->print();
std::cout << "Going out of the block" << std::endl;
}
ptr1 -> print();
std::cout << "Going out of the outer block << std::endl;
}
#include <iostream>
#include <memory>
class B; // 전방 선언
class A {
public:
std::weak_ptr<B> b_ptr; // 약한 참조로 변경
~A() { std::cout << "A 소멸" << std::endl; }
};
class B {
public:
std::weak_ptr<A> a_ptr; // 약한 참조로 변경
~B() { std::cout << "B 소멸" << std::endl; }
};
int main() {
auto a = std::make_shared<A>();
auto b = std::make_shared<B>();
a->b_ptr = b;
b->a_ptr = a; // 약한 참조로 인해 순환 의존성 해결
return 0; // 메모리 누수 없음, A와 B가 정상적으로 소멸
}