- 소유권 문제가 있었음
- 멤버 데이터를 깊은 복사 대신 얕은 복사를 함
- 복사를 허용하지 않음
1. std::unique_ptr
- 복사를 허용하지 않음
#include <memory>
auto main() -> int
{
std::unique_ptr<int> p1(new int(5));
std::unique_ptr<int> p2(new int(5));
//std::unique_ptr<int> p3 = p1; // 컴파일러 에러남
//auto p3 = p1;
std::unique_ptr<int> p3 = std::move(p1); // 소유권이 p2로 이동, p1은 nullptr
p1.get(); // get함수로 주소값 반환
p2.get();
p3.get();
auto a1 = *p1; // 가리키는 값 대입 가능
auto& a2 = p1; // 참조 가능
p3.reset(); // 영역 초기화, p3는 nullptr, 메모리 해제는 필요 없음
p1.reset(); // nullptr이므로 아무일도 일어나지 않음
return 0; // auto_ptr를 계승하여서
//정의된 범위를 벗어난 객체는 자동으로 소멸 됨
}
2. std::shared_ptr
- 객체의 소유권을 이곳저곳에서 공유할 수 있음
- 특정 포인터 객체를 여러개의 shared_ptr 객체가 가리키도록 할 수 있음
- 레퍼런스 카운팅 사용 (복사 : +1, 삭제 : -1)
- 해제되는 시점 : 레퍼런스 카운트가 0이 될 때
std::shared_ptr<int> p1(new int(5)); // 레퍼런스 카운트 +1
std::shared_ptr<int> p2 = p1; // 레퍼런스 카운트 +1
auto p3 = p1; // 레퍼런스 카운트 +1
p1.reset();
p2.reset();
p3.reset(); // 메모리 해제
3. std::weak_ptr
- shared_ptr는 순환 참조 문제가 있음 (A->B, B->A)
- 가리키는 메모리 공간은 shared_ptr가 메모리 관리를 하려고 사용하는 레퍼런스 카운트에 포함 안됨
std::shared_ptr<int> sp1(new int(5));
std::weak_prt<int> wp1 = sp1; // 공유하지만 소유권은 sp1에게 있음
{
std::shared_ptr<int> sp2 = wp1.lock(); // sp1을 wp1으로 sp2에게 복사, 레퍼런스 카운트 : 2
} // sp2는 자동을 파괴
sp1.reset(); // sp1 파괴
std::shared_ptr<int> sp3 = wp1.lock(); // wp1은 가리키던 공유 포인터의 리소스가 해제되면 자동으로 파괴 되므로, lock() 함수 호출시 빈 shared_ptr객체 반환, sp3는 nullptr
4. 동시성 문제
- 멀티스레드에서 사용 가능
- 각 스레드가 각각의 공유포인터가 내부에 있고, 공유 포인터가 동일한 리소스에 접근하는 경우 안전
- 각 스레드가 스레드 외부에 있는 shared_ptr 객체에 접근하면 C++11이 제공하는 다른 함수를 사용해야함
'programing > C++' 카테고리의 다른 글
코드 최적화 (0) | 2016.09.20 |
---|---|
조이패드(Joypad) Input (0) | 2016.09.09 |
[Modern C++] std::array (0) | 2016.08.16 |
[Modern C++] 유니폼 초기화(vector) (0) | 2016.08.16 |
[Modern C++] range-based for (범위 기반 for문) (0) | 2016.08.16 |