헤더파일

스마트 포인터 본문

C++

스마트 포인터

헤더파일 2018. 4. 5. 11:56

c++11에 들어오면서 꼭 해야하는게 있습니다.

-const 일관성을 유지할것

-raw pointer를 사용하지마라

-STL을 적극사용하라

-range-based for loop와 auto를 적극 사용하라

-가능한 한 모든곳에서 lamda를 사용하라




unique_ptr 자원을 독점한다.

shared_ptr 자원을 공유한다.


int main()

{

Model* p = new Model;

//Save();

}


이런 식으로 해도 문제는 없다.  운영체제가 알아서 회수는 해줍니다.

좀 더 자원을 효율적으로 사용하고 싶다면 밑에서 

delete p 해주면 됩니다.

하지만 메모리를 쓰고 지우기까지는 많은 시간과 공간의 차이가 있습니다. 만드는 함수에서 바로 지우는 경우는 거의 없습니다. 때문에 해제하지 않는 객체가 존재해 메모리릭이 많이 일어날 수 있습니다.


유니크 포인터


int main()

{

unique_ptr<Model> p (new Model);

//Save();

}


스마트 포인터를 함수가 끝날 때 알아서 회수를 해줍니다..


유니크 포인터를 클래스로 직접 대충 작성해보면 이렇습니다.

template<typename T>

class up

{

T* data;

public:

up(T* p)

{

data = p;

}

up(const up& other) = delete;

~up()

{

delete data;

}

};

unique 포인터는 raw포인터와 크기가 같다.

독점한다는 의미는 다른 포인터가 가리킬려고 하지 못한다. -> 복사생성자를 delete 했다는 의미입니다.


만약에 포인터를 독점하지 않는다고 선언하고 다른 포인터로 이사가려면 어떻게 해야할까?

unique_ptr<Model> q(p.release());

release 함수로 가진 자원을 놓아준 다음에 q에게 넘겨주면 됩니다.


vector<unique_ptr<Player>> v;

v.push_back(Player());


유니크포인터는 복사가 되지 않기 때문에 vector에 담을 수 없습니다.




쉐어드포인터


프로그램은 메모리와 시간을 항상 반비례하고 어느쪽이 희생될수 밖에 없습니다.

 shared_ptr은 포인터의 크기가 큰 대신 자원을 공유할 수 있습니다.

자원은 비싸기 때문에 상황에 따라 쉐어드 포인터는 유용합니다.


int main()

{

shared_ptr<Model>p(new Model{ 333 });

shared_ptr<Model>q = p;

shared_ptr<Model>r = q;


cout << r.use_count() << endl;

p.reset();

cout << r.use_count() << endl;


//Save();

}



포인터는 몇개든 붙을 수 있고 use_count()로 몇개가 붙었는지 확인할 수 있습니다.

reset함수로 해당 포인터만 끊을 수 있습니다.




'C++' 카테고리의 다른 글

컨테이너 - 2  (0) 2018.04.09
컨테이너 -1  (0) 2018.04.05
이동  (2) 2018.03.29
템플릿 - 3  (0) 2018.03.22
템플릿- 2  (0) 2018.03.19
Comments