본문 바로가기
programing/C++

[Modern C++] 스마트 포인터

by RedWiz 2016. 8. 16.
0. std::auto_ptr


- 소유권 문제가 있었음

- 멤버 데이터를 깊은 복사 대신 얕은 복사를 함

- 복사를 허용하지 않음


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